Bashのstdinパイプを介してファイルから行を削除する

Bashのstdinパイプを介してファイルから行を削除する

次のスクリプトを使用してください。

awk '{print $0"\t"NR}' test | grep NA | awk '{print $21}'

「NA」を含むファイルから行番号を取得しています。

326
399
672
1512
1734
1737
2212

使用sed、最後のawkコマンドの後にパイプして、同じコマンドの標準入力を介してこの行をファイルから削除できますか?そうでなければ簡単な方法はありますか?

ベストアンサー1

より簡単な方法は以下を使用することですsed

sed '/NA/d' test >test.new

内部編集にGNUを使用したい場合sed(これによりファイルが修正されますtest):

sed -i '/NA/d' test

このsed式は、正規表現に一致する入力のすべての行にコマンドを適用します/NA/d。このコマンドは行を削除します。dNAd


行番号が次の場合みんなもしそうなら、私は次のように動作します。

some_command | sed 's/$/d/' | sed -f /dev/stdin test >output

ここでsome_commandファイルから削除したい行番号を生成しますtest

最初は、sed各行に a を追加して数値ストリームをスクリプトに変換します。行の読み取りは「行100の削除」と解釈されます。その後、これは実際のスクリプトとして2番目のスクリプト(スクリプトを読む)に供給され、ファイルに適用されます。sedd100dsed/dev/stdintest

シェルでプロセスの置き換えに対応する内容を学びます。

sed -f <( some_command | sed 's/$/d/' ) test >output

ただし、その文字列を含む行のみを削除したい場合は、NA愚かです。

おすすめ記事