我有一个具有以下格式的数据文件:
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命令,但是我不太确定如何指定条件,也不确定如何创建取决于数据拆分次数的输出文件。
答案 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