例:これはソースファイルです。 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