AWK 根据模式拆分文件,并在模式后的第一行用字符串命名新文件

AWK 根据模式拆分文件,并在模式后的第一行用字符串命名新文件

考虑这个文件:

#!/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通过调用执行,如下所示 - 注意你systemgzip关闭输入和输出重定向

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

相关内容