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)
。