考虑这个文件:
#!/usr/bin/env bash
cat > example_file.txt <<EOL
sdk,jalxa,9325
m,head1,3
ae,wea,2232
ax1,awq,2321
m,head1,32
dgf,12a,8923
m,head1,11
bsda,awq,902
9as,wea,1732
ax1,awq,2321
EOL
我想将其拆分为以 开头的行m,head1,
。因此结果将是:
文件_wea.txt:
m,head1,3
ae,wea,2232
ax1,awq,2321
文件_12a.txt:
m,head1,32
dgf,12a,8923
文件_awq.txt:
m,head1,11
bsda,awq,902
9as,wea,1732
ax1,awq,2321
例如,拆分后的文件应以拆分模式后第一行第二列(逗号分隔)中的条目命名。我对这部分感到很困惑(如何在 AWK 中引用下一行?)
答案1
您可以使用 awk 中的下一行读取获得行
快速而粗略的说明(您应该真正检查其返回值并采取相应的措施):
awk -F, '
/^m,head/ {
tmp = $0; getline; outfile = "file_" $2 ".txt"; print tmp > outfile
}
outfile != "" {
print > outfile
}
' example_file.txt
给予
$ head file_*.txt
==> file_12a.txt <==
m,head1,32
dgf,12a,8923
==> file_awq.txt <==
m,head1,11
bsda,awq,902
9as,wea,1732
ax1,awq,2321
==> file_wea.txt <==
m,head1,3
ae,wea,2232
ax1,awq,2321
如果文件名不唯一,您可能需要附加(>>
)而不是截断(>
)。
如果你想要这些块,那么你可以通过标准输入打印数据,gzip
而不是创建纯文本文件,然后gzip
通过调用执行,如下所示 - 注意你system
gzip
关闭输入和输出重定向
awk -F, '
/^m,head/ {
close("gzip >" outfile);
tmp = $0; getline; outfile = "file_" $2 ".txt.gz"; print tmp | "gzip >" outfile
}
outfile != "" {
print | "gzip >" outfile
}
END {
close("gzip >" outfile)
}
' example_file.txt