パターンを使用してファイルを別々のファイルに分割する

パターンを使用してファイルを別々のファイルに分割する

ファイル(例を参照)を別々のファイルに分割する必要があります。各新しいファイルは7行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変数はn2番目のフィールド(名前)に設定されます。
  • /^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

これによりファイルヘッダーがスキップされ、データのみがファイルに保存されます。

関連情報