パターンごとにファイルを分割し、2番目のパターンを含むフラグメントのみを保持します。

パターンごとにファイルを分割し、2番目のパターンを含むフラグメントのみを保持します。

パターンに従って大きなファイルを小さな部分に分割するための前の答えで、次の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結果を分割します。sedawk

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前のバッファと一致しないすべての行を追加し、最後の行でない場合は削除し、一致する行に含まれていない場合はバッファを変更します。パターン空間。その後、結果はにパイプされます。エラーが発生した場合は、次のファイルを使用する必要があります。IDHxIDsome_methodawktoo many open filesclose()

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使用できます。csplitawk

sed '1{h;d};/ID/!{H;$!d};x;/some_method/!d' infile | \
csplit -f 'part-' -b '%03d.txt' -sz - /ID/ '{*}'

おすすめ記事