提取数据并保存在不同的输出文件中

时间:2018-10-11 19:51:06

标签: bash awk

我有一个具有以下格式的数据文件:

aaa     0
bbb     1
ccc     2
ddd     ?
eee     0
fff     1
ggg     2
hhh     3
iii     ?
   ...

我想做的事情很简单:提取数据的一部分并将其保存在不同的文件中,分割的条件是仅取0和'?之间的行。这样我就可以获得:

output_1.txt>

aaa     0
bbb     1
ccc     2
ddd     ?

output_2.txt>

eee     0
fff     1
ggg     2
hhh     3
iii     ?

依次类推,直到到达输入文件的末尾。 我尝试研究awk命令,但是我不太确定如何指定条件,也不确定如何创建取决于数据拆分次数的输出文件。

2 个答案:

答案 0 :(得分:3)

您可以在awk中重定向打印语句:

awk -v n=1 '{print > ("output_" n ".txt")} $2 == "?" {n++}' file

如果文件很大,则可能必须显式关闭打开的文件:

awk -v n=1 '
    {print > ("output_" n ".txt")} 
    $2 == "?" {close("output_" n ".txt"); n++}
' file

如果我真的很干燥,我会写

awk -v n=1 '
    function filename(n) {return "output_" n ".txt"} 
    {print > filename(n)} 
    $2 == "?" {close(filename(n++))}  # important, post-increment
' file

答案 1 :(得分:3)

您需要的是:

awk 'NR==1 || $NF=="?"{close(out); out="output_"++cnt".txt"} {print > out}' file

对于任何大小的输入文件,以上内容均可在任何UNIX系统上的任何Shell中的任何awk中使用。

如果您想对?进行部分匹配(请参见下面的评论),则可以选择以下两种方式之一:

awk 'NR==1 || index($NF,"?"){close(out); out="output_"++cnt".txt"} {print > out}' file

awk 'NR==1 || $NF~/\?/{close(out); out="output_"++cnt".txt"} {print > out}' file

awk 'NR==1 || $NF~/[?]/{close(out); out="output_"++cnt".txt"} {print > out}' file