我需要将一个文件(参见示例)拆分为单独的文件。每个新文件应继承第 7 行中的名称 ie等SAMPLE1.txt
。SAMPLE2.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
如果行以 开头#name
,x
则存储该行的最后一个单词。然后,对于所有由#End_of_file_header
和分隔的块,EOD
我将行打印到一个文件中,该文件的名称是内容x
这将跳过文件头,仅将数据存储到文件中。