ファイルで特定の文字列が見つかるたびに特定の行数を削除する方法

ファイルで特定の文字列が見つかるたびに特定の行数を削除する方法

ファイルで文字列が見つかるたびに、最初の1行と最後の10行を削除したいと思います。

foo.txt:

} Name: john Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10 Line 11 Line 12 Apple orange grape pine } Name: Ruben Line Line Line Line Line Line Line Line Line Line grape zebra donkey } Name: Tom Line Line Line Line Line Line Line Line Line Line Tiger red blue orange tomato cat }

期待するOut.txt:

Name: john Apple orange grape pine Name: Ruben grape zebra donkey Name: Tom Tiger red blue orange tomato cat

sedまたは中かっこと名前:nawk後の次の10行を削除したいと思います。 Solaris 5.10とksh

ベストアンサー1

awkを使う

$ awk '/}/{next;} /Name:/{print;n=NR+10} NR>n' file
Name: john
Apple
orange
grape
pine
Name: Ruben
grape
zebra
donkey
Name: Tom
Tiger
red
blue
orange
tomato
cat

どのように動作しますか?

  • /}/{next;}

    インクルードをスキップします}

  • /Name:/{print;n=NR+10}

    含める行に達すると、印刷してから10に現在の行番号を追加して設定し、Name:いつ再印刷を開始するかを確認できます。n

  • NR>n

    現在の行番号が大きい場合は、n基本操作が行われます。行を印刷します。

sedを使う

非常に似たロジックを使用します。

$ sed -e '/}/d' -e '/Name:/{p;N;N;N;N;N;N;N;N;N;N;d;}' file
Name: john
Apple
orange
grape
pine
Name: Ruben
grape
zebra
donkey
Name: Tom
Tiger
red
blue
orange
tomato
cat

どのように動作しますか?

  • /}/d

    含まれているものをすべて削除してください}

  • /Name:/{p;N;N;N;N;N;N;N;N;N;N;d;}

    含まれている行が見つかったら、Name:印刷して次の10行を読み、削除します。

上記のカテゴリのいずれにも属さない行を印刷します。

おすすめ記事