
パターンに従って大きなファイルを小さな部分に分割するための前の答えで、次のawkスクリプトを見つけました(「ヘッダー行」を別のパターンに置き換えます)。ただし、潜在的に数百万の部品が作成される可能性があるため、さらに一歩進む必要がありますが、各部品を再フィルタリングできる場合は、必要なものを得ることができます。
awk '
/header-line/ {++part}
{print >sprintf("part-%03d.txt", part)}
'
各「セクション」を作成する前または後に質問して、そのセクションに特定のパターンがあることを確認し、追加されたパターンと一致する場合にのみそのセクションを作成することは可能ですか?
たとえば、初期条件は「ID:」(上記のヘッダ行)です。次に、特定のメソッド名に対して生成されたすべての「部分」を検索しようとします。検索する文字列として "searchForThisMethod"を呼び出します。この文字列は、部分内のさまざまな場所に配置できます。
入力例:
ID: 1
bb
bb
bb
bb
secondaryCheck
ID: 2
b
b
b
b
b
b
b
b
ID: 3
h
h
h
h
h
secondaryCheck
g
g
g
g
答え1
ファイルを分割してgrep -q some_method
各部分で実行し、次の場合に削除できます。間違った例えば
for file in part-*.txt; do
grep -q some_method "$file"
if [ $? -ne 0 ]
then
rm "$file"
fi
done
または2つのパスを使用します。最初のパスと2番目のパスの次の
コードのように、入力に含まれる「部分」を削除してからsome_method
結果を分割します。sed
awk
sed -e '1{h;d;}' -e '/ID/!{H;$!d;}' -e 'x;/some_method/!d' infile | \
awk '/ID/{++part}{print > sprintf("part-%03d.txt", part)}'
sed
最初の行をh
前のバッファにコピーして削除し、d
前のバッファと一致しないすべての行を追加し、最後の行でない場合は削除し、一致する行に含まれていない場合はバッファを変更します。パターン空間。その後、結果はにパイプされます。エラーが発生した場合は、次のファイルを使用する必要があります。ID
H
x
ID
some_method
awk
too many open files
close()
sed -e '1{h;d;}' -e '/ID/!{H;$!d;}' -e 'x;/some_method/!d' infile | \
awk '/ID/{++part}{close(fn);fn=sprintf("part-%03d.txt", part);print >> fn}'
または/ anythingを使用している場合は、次のものを代わりにgnu
使用できます。csplit
awk
sed '1{h;d};/ID/!{H;$!d};x;/some_method/!d' infile | \
csplit -f 'part-' -b '%03d.txt' -sz - /ID/ '{*}'