Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 通过多行交替将文件拆分为子文件_Bash_Awk_Split_Line - Fatal编程技术网

Bash 通过多行交替将文件拆分为子文件

Bash 通过多行交替将文件拆分为子文件,bash,awk,split,line,Bash,Awk,Split,Line,我想将一个多行输入文件(file)拆分为两个输出文件(out1,out2),这样每个n行都以交替方式保存到一个输出文件中 例如,如果n=2和file共有六行,则file的前两行保存到out1,接下来的两行保存到out2,最后两行再次保存到out1 $ cat file foo foo bar bar baz baz $ cat file | sought_command out1 out2 # n=2 $ cat out1 foo foo baz baz $ cat out2 bar bar

我想将一个多行输入文件(
file
)拆分为两个输出文件(
out1
out2
),这样每个
n
行都以交替方式保存到一个输出文件中

例如,如果
n=2
file
共有六行,则
file
的前两行保存到
out1
,接下来的两行保存到
out2
,最后两行再次保存到
out1

$ cat file
foo
foo
bar
bar
baz
baz

$ cat file | sought_command out1 out2  # n=2
$ cat out1
foo
foo
baz
baz
$ cat out2
bar
bar
我相信这可以用awk来完成,我希望你能告诉我如何开始

编辑1: 我知道问题可以简化为简单地打印
n
行,然后不打印下一个
n
行,然后无限次地打印
n
行,就像循环在这些行中迭代一样。再加上设置关于从哪条线开始的偏移量就足以解决问题


我知道我可以通过
awk'NR%3==1'文件每三行打印一次,但是我如何每三行打印一次呢?

沿着这些行,输入从1到100的数字:

seq 1 100 | awk -v n=4 'BEGIN{f=1} { if((NR-1)%n==0){f=1-f}; print > "out" f}'
我能做到这一点

awk -vn="2" '!((NR-1)%n){file=file=="file1"?"file2":"file1"}{print > file}' file
只需根据三元数每隔n行切换文件名,并将每行打印到指定的文件名

$ awk '(NR%2)==1{out = "out" ((c++)%2)+1 } {print " > " out}' file
foo > out1
foo > out1
bar > out2
bar > out2
baz > out1
baz > out1

只需将
“>”
更改为
,即可实际生成输出文件。

有关入门信息,请参阅和。。。您可以使用
NR
变量处理行号…您可以在这里使用awks内置的块条件检查,而不是显式的
if
,即
((NR-1)%n==0){f=1-f}{print>“out”f}
@123是的,同意-谢谢。有很多很多方法可以做到这一点:-)
print>“out”f
是POSIX中未定义的行为。在某些AWK中,它会做你想做的事情,在其他AWK中,它会做一些完全不同的事情。为了便于携带,您需要
print>(“out”f)