awk は、特定の列で引数が見つかると行を削除します。

awk は、特定の列で引数が見つかると行を削除します。

不明なサイズのファイル全体を繰り返し、指定された列から指定された単語(パラメータ1に渡される)が発生したすべての行を削除する必要があります。また、削除された行数を追跡する必要があります。私はこれがawkの仕事だと仮定していますが、多くの困難を経験しています。私はawk matchを試しましたが、他の構文の問題以外に引数を単語に変換することはできません。

はい(file.txt):

Katie 1234 4567 blue
Ben 3456 2345 purple
Alex 7896 6789 blue

$ script.sh blue 4

ファイルを次のように編集します。

Ben 3456 2345 purple

そして出力:2 lines removed

私はコードを取得するよりも私がやっていることを理解することに興味があります。

ベストアンサー1

#!/bin/sh
awk -v value="$1" -v column="$2" '
  $column == value {++removed; next}
  1 {print}
  END {print removed " lines removed" >"/dev/stderr"}
' <File.txt >File.txt.tmp &&
mv File.txt.tmp File.txt

説明する:

  • -v value="$1"awk変数をvalueシェルスクリプトの最初のパラメータに設定します。
  • 各行に対して条件が$column == valuetrue の場合、中かっこ内のコードが実行されます。
    • $column列番号の内容ですcolumn(1から始まります)。
    • ++removed削除された行のカウンタをインクリメントします。変数は0から始まります。
    • nextprint条件がtrueの場合、コマンドが実行されないように次の入力ラインにジャンプします。
  • 1 {print}nextコマンドの実行を引き起こさなかった各行を印刷します。 (1常に真の条件です。)
  • END {…}入力の終わりに中かっこで囲まれたコードを実行します。
  • awkコードは一時ファイルに書き込み、その場所に移動します。

おすすめ記事