awk 编程:根据模式将大文件拆分为小文件

Sru*_*.B. 5 command-line bash awk text-processing

我有一个大文件 input.dat,如下所示。

kpoint1 :       0.0000    0.0000    0.0000
  band No.  band energies     occupation 
      1     -52.8287      2.00000
      2     -52.7981      2.00000
      3     -52.7981      2.00000
 kpoint2 :       0.0000    0.0000    0.0000
  band No.  band energies     occupation 
      1     -52.8287      2.00000
      2     -52.7981      2.00000
      3     -52.7981      2.00000
Run Code Online (Sandbox Code Playgroud)

我需要将文件拆分为 2 个较小的文件,如下所示

kpoint1.dat

kpoint1 :       0.0000    0.0000    0.0000
  band No.  band energies     occupation 
      1     -52.8287      2.00000
      2     -52.7981      2.00000
      3     -52.7981      2.00000
Run Code Online (Sandbox Code Playgroud)

kpoint2.dat

kpoint1 :       0.0000    0.0000    0.0000
  band No.  band energies     occupation 
      1     -52.8287      2.00000
      2     -52.7981      2.00000
      3     -52.7981      2.00000
Run Code Online (Sandbox Code Playgroud)

我写了一个小脚本来做到这一点。脚本如下所示。

for j in {1..2} 
do
    awk '$1=="kpoint'$j'" {for(i=1; i<=3; i++){getline; print}}' tmp7 >kpoint'$j'.dat
done
Run Code Online (Sandbox Code Playgroud)

该脚本创建具有所需名称的输出文件。但是所有文件都是空的。任何人都可以帮我解决这个问题吗?

mur*_*uru 5

这完全可以通过以下方式完成awk

$ awk '$1 ~ /kpoint[0-9]/ { file = $1 ".dat" } {print > file}' file
$ head kpoint*
==> kpoint1.dat <==
kpoint1 :       0.0000    0.0000    0.0000
  band No.  band energies     occupation
      1     -52.8287      2.00000
      2     -52.7981      2.00000
      3     -52.7981      2.00000

==> kpoint2.dat <==
 kpoint2 :       0.0000    0.0000    0.0000
  band No.  band energies     occupation
      1     -52.8287      2.00000
      2     -52.7981      2.00000
      3     -52.7981      2.00000
Run Code Online (Sandbox Code Playgroud)

Awk 还支持> file重定向,但有一些细微的差别(有关更多信息,请参阅GNU awk 手册)。