次のスキーマを持つ巨大なファイルがあります。
ABC
line 1
line 2
line 3
ABC
line 1
line 2
ABC
line1
ABC
line 1
line 3
ツールを使用して、上記のファイルをパターンに応じて4つのサブファイルに分割csplit
できます。/ABC/
csplit -z input.txt /ABC/ {*}
必要な出力ファイルの数を手動で指定する方法を知りたいです。
答え1
使用できますawk
。正確に望むわけではありませんが、効果があるかもしれません。
アイデア:n行を部品ファイルとして印刷し、新しい部品ファイルを作成する前に、次のパターン発生を検索します。
欠点:
- 大きなチャンクがあり、そのチャンクの先頭をスキップすると、一部のファイルが他のファイルよりもはるかに大きくなる可能性があります。
- 元のファイルは削除されません(つまり、必要なスペースの2倍)。
- 書かれているように、一致する行は正確でなければなりません
ABC
(同じ行の他の単語と比較して許容範囲はなく、調整可能)。 - 必要な出力ファイルの数(入力ファイルの行数で推定)の代わりに行数を設定することで機能します。
akw
- スクリプト
BEGIN{
outfile="part_"++i
j=0
}
{
j++
#block size set to at least 10 lines in this example
#if threshold line number reached: search for next keyword,
#then increase part file name counter and reset line threshold counter
if ( j>=10 && $0 == "ABC" ) { outfile="part_"++i ; j=0 }
print > outfile
}
実行に合格しました。
awk -f script.awk input.txt