列9と10で「20」の値が見つかるたびにファイルを小さなファイルに分割する方法

列9と10で「20」の値が見つかるたびにファイルを小さなファイルに分割する方法

例:これはソースファイルです。 20は、9列と10列の「1」行と「9」行に表示されます。したがって、これをファイル1とファイル2の2つのチャンクファイルに分割する必要があります(列9と10で20の値が2回見つかったため)。

0012345020DTL0
00000000510000
00000000520000   
00000000530000                                                                                                                                                                                                 
12342000510000
00000000520000  
00000000532000
00000000800000
0000000020DTL0                                                                                                                                                                                           
00000000510730
00000000520000
1234500053 000                                                                                                                                                                                                   
00000000510000
00000000520000 
00000000530000
00000000800000

20上記のファイルを9列と10列の値に基づいてチャンクファイルに分割する必要があります。 9列と10列に20が表示されるたびに、ファイルは単にチャンクファイルに分割されます。 9列と10列以外の場所に20が表示されている場合は、分割する必要はありません。

出力:ファイル1:

0012345020DTL0
00000000510000
00000000520000   
00000000530000                                                                                                                                                                                                 
12342000510000
00000000520000  
00000000532000
00000000800000

ファイル2:

1298600020DTL0                                                                                                                                                                                           
00000000510730
00000000520000
1234500053 000                                                                                                                                                                                                   
00000000510000
00000000520000 
00000000530000
00000000800000   

答え1

csplitパターンベースのファイル分割を使用できます。

csplit <file> <split pattern> <repetiotions>

つまり:

csplit -z datafile '/^........20/' '{*}'

説明する:

  • -z:空のファイルを作成しないでください。 (最初の行のパターンから始めると、パターンが一致するまで「0」行からファイルが残ります。

  • '/^........20/':分割パターンと一致します。ここで^、=行の始まり、.=すべての文字(8回)

  • {*}:できるだけ繰り返す

答え2

あなたはそれを使用することができますawk

awk 'BEGIN{filename=0};$0 ~ /^........20....$/{filename++};{print >> "file"filename}' input_file

提供された入力に基づいて、以下が生成されます。

file1:

0000000020DTL0
00000000510000
00000000520000   
00000000530000
00000000510000
00000000520000  
00000000530000
00000000800000

file2:

0000000020DTL0
00000000510730
00000000520000
0000000053 000
00000000510000
00000000520000 
00000000530000
00000000800000

関連情報