キーワードと複数行の数字を含むエントリが多いファイルがあります。特定のタイプのアイテムをフィルタリングしたいので、アイテムderpの後に3行が続く場合は、ファイル名grep -v -A3 derp filename
からderpタイプ以外のすべてのアイテムを取得したいと思います。問題は非互換性のようです-v
。-A
両方のフラグを使用すると-v
無視されます。私はまた何ができますか?ファイルは次のようになります。
SOURCE: pI < min 45 16 0 7.4871483836177132E-004 5.1628324610858206E-004 -1.826383220714803 -9.4293105782888549E-004 -6.8875048798939895E-002 -0.2196057448134437 -6.6270591049115615E-003 SOURCE: pI < min 45 17 0 7.1266687952112871E-004 5.1628324610858206E-004 -2.169039713847648 -1.1198388644036935E-003 -8.2240618017566103E-002 -9.0412967200093102E-005 -7.5453919169102962E-003 SOURCE: pI < min 45 18 0 7.0936181176839061E-004 5.1628324610858206E-004 -2.589392543137075 -1.3368599876201657E-003 -9.8187643312659903E-002 -1.1762198384731523E-005 -9.4417591779528513E-003
これは数千行にわたって同様の方法で続く。場合によっては、項目が以外のもので始まることがありますSOURCE: pI < min
。私が探したいのはこれらの項目です。ファイルサイズは約50Mbです。
答え1
役に立つものを見つけました。
grep -A3 derp filename | diff - filename
答え2
別の方向からやってみてはいかがでしょうか?
sed '/pattern/,+3d' input_file
またはない場合gnu sed
:
sed '/pattern/ {N;N;N;d;} input_file
パターンを含む行と、その行の後の3行を除くすべてのテキストが表示されます。
または、ファイルをその場で編集するには:
sed -i '/pattern/,+3d' input_file
-i
お客様の製品がサポートしていない場合sed
:
sed '/pattern/ {N;N;N;d;} inputfile > output_file
mv output_file input_file
デフォルトでは、必要な操作を実行する必要があります。つまり、ファイルを含める必要があります。
cat
dog
dog
dog
horse
これが私のパターンであれば、horse
結果は1つだけ取得されます。cat
答え3
必要でない他の項目がすべて数値ではないと仮定すると、を使用してその項目のリストを作成できますgrep -v '^([0-9-]+|SOURCE:)' filename
。これにより、一致する行全体が出力されるため、追加の処理が必要です。
すべて単語の後にコロンが続くパターンに従う場合に使用できますawk -F: '!/^([0-9]+|SOURCE:)/ { print $1}'
。
リストがある場合は、それを使用してすべての項目に一致する正規表現を作成し、一致する項目の1つが見つかるたびにsed
4行を削除するために使用できます。
たとえば、
LIST=$(awk -F: '!/^([0-9-]+|SOURCE:)/ { print $1}' filename | sort -u)
RE=$(echo $LIST | sed -e 's/ /|/g')
sed -r -e "s/^($RE):/,4 d" filename
一部の項目を削除するなど、正規表現を作成する前にリストの追加処理が必要な場合は、次のことができます。
RE=$(echo "$LIST" | egrep -v '^(FOO|BAR)$' | xargs echo | sed -e 's/ /|/g')
今回は「$ LIST」の周りに二重引用符があることに注意してください。これはegrepで使用される改行を維持します(これが1行xargs echo
のすべてのリスト項目を取得するために後でパイプする必要がある理由ですsed
)。