awk:在第n个分隔符出现时分割文件,错误的第一个分割文件

时间:2017-02-17 15:33:50

标签: bash awk

我想在">"的每一次出现时拆分一个文本文件,如下面粘贴的文件(对不起长度)。例如,每隔2次出现">",但我需要能够更改该数字。

test_split.txt:

>eeefkdfn
a
a
a
>c 4ufjdhf
b
b
b
b
>
c
c
> c
d
d
d
d
d
>3
>cr
>c3
e
e
e
e
e
> 5
f
f
f
f
>cr
g
g
g
g
> cr dkjfddf
h
h
h
h

所以我希望这些输出文件(仅显示前两个):

file_1.txt:

>eeefkdfn
a
a
a
>c 4ufjdhf
b
b
b
b

file_2.txt:

>
c
c
> c
d
d
d
d
d

问题:

我一直在尝试使用这个awk命令来实现这个结果:

awk '/^>/ {n++} { file = sprintf("file_%s.txt", int(n/2)); print >> file; }' < test_split.txt

而不是期望的结果,我得到正确的输出(分割)文件,除了第一个,其中只包含一个&#34;&gt;&#34; (而不是两个),像这样:

cat test_0.txt

>eeefkdfn
a
a
a

cat test_1.txt

>chr1 4ufjdhf
b
b
b
b
>
c
c

知道为什么会这样吗?谢谢!

2 个答案:

答案 0 :(得分:3)

这似乎更简单:

awk 'BEGIN{i=1}/^>/{cont++}cont==3{i++;cont=1}{print > "file_"i".txt"} file

Will会给你预期的结果:

$ cat file_1.txt
>eeefkdfn
a
a
a
>c 4ufjdhf
b
b
b
b

$ cat file_2.txt
>
c
c
> c
d
d
d
d
d

<强>解释

BEGIN{i=1}:文件计数器初始化。

/^>/{cont++}:计算找到的每个>

cont==3{i++;cont=1}:增加文件计数器并初始化cont var,> char的第三次出现再次成为第一个。

{print > "file_"i".txt"}:将输出定向到预期文件。

答案 1 :(得分:2)

您可以使用此awk对数字n进行动态控制,其中文件将在输入数据中nth出现>时拆分:

awk -v n=2 'function ofile() {
   if (op)
      close(op)
   op = sprintf("file_%d.txt", ++p)
}
BEGIN {
   ofile()
}
/>/ {
   ++i
}
i > n {
   i=1
   ofile()
}
{
   print $0 > op
}
END {
   close(op)
}' file

如果您想要复制/粘贴,这是一个衬垫:

awk -v n=2 'function ofile() {if (op) close(op); op = sprintf("file_%d.txt", ++p)} BEGIN{ofile()} />/{++i} i>n{i=1; ofile()} { print $0 > op }' file