![AWK 根据模式拆分文件,并在模式后的第一行用字符串命名新文件](https://linux22.com/image/916053/AWK%20%E6%A0%B9%E6%8D%AE%E6%A8%A1%E5%BC%8F%E6%8B%86%E5%88%86%E6%96%87%E4%BB%B6%EF%BC%8C%E5%B9%B6%E5%9C%A8%E6%A8%A1%E5%BC%8F%E5%90%8E%E7%9A%84%E7%AC%AC%E4%B8%80%E8%A1%8C%E7%94%A8%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%91%BD%E5%90%8D%E6%96%B0%E6%96%87%E4%BB%B6.png)
考虑这个文件:
#!/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