使用模式将文件拆分为单独的文件

使用模式将文件拆分为单独的文件

我需要将一个文件(参见示例)拆分为单独的文件。每个新文件应继承第 7 行中的名称 ie等SAMPLE1.txtSAMPLE2.txt

@File_Version: 4
@Coordinate_Type_is: 1
@Export_Type_is: 1
@Number_of_P: 1
@T_Type_Name: , 
#File_Version____________-> 4
#Name____________-> SAMPLE1
#Type____________-> 3

#End_of_file_header
    000000.00000    0000000.00000   0000.00000
    000000.00000    0000000.00000   0000.00000
...
EOD

@File_Version: 4
@Coordinate_Type_is: 1
@Export_Type_is: 1
@Number_of_P: 1
@T_Type_Name: , 
#File_Version____________-> 4
#Name____________-> SAMPLE2
#Type____________-> 3

#End_of_file_header
    000000.00000    0000000.00000   0000.00000
    000000.00000    0000000.00000   0000.00000
...
EOD

@File_Version: 4
@Coordinate_Type_is: 1
@Export_Type_is: 1
@Number_of_P: 1
@T_Type_Name: , 
#File_Version____________-> 4
#Name____________-> SAMPLE3
#Type____________-> 3

#End_of_file_header
    000000.00000    0000000.00000   0000.00000
    000000.00000    0000000.00000   0000.00000
...
EOD

答案1

你可以这样做awk

awk '{
        if(/@File_Version:/){k=$0;}
        else{k=k"\n"$0}
     } 
    /^#Name/{n=$2}
    /EOD/{
        print k > n".txt"; 
    }' file 

解释

  • if(/^@File_Version:/){k=$0;}:如果该行以 开头@File_Version:,则将该行另存为k.
  • else{k=k"\n"$0}:对于所有其他行,添加一个换行符 ( \n),后跟当前行到 的当前值k
  • /^#Name/{n=$2}:如果此行以 开头#Name,则将变量设置n为第二个字段(名称)。
  • /^EOD/{print k > n".txt";}:如果此行以 开头EOD,则将变量k(现在包含整个记录)打印到名为的文件中,n.txt其中n是上一步中保存的名称。

答案2

awk '/#Name/{ x=$NF;  }; /#End_of_file_header/,/EOD/{ print > x} '  test1

如果行以 开头#namex则存储该行的最后一个单词。然后,对于所有由#End_of_file_header和分隔的块,EOD我将行打印到一个文件中,该文件的名称是内容x

这将跳过文件头,仅将数据存储到文件中。

相关内容