不明なサイズのファイル全体を繰り返し、指定された列から指定された単語(パラメータ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 == value
true の場合、中かっこ内のコードが実行されます。$column
列番号の内容ですcolumn
(1から始まります)。++removed
削除された行のカウンタをインクリメントします。変数は0から始まります。next
print
条件がtrueの場合、コマンドが実行されないように次の入力ラインにジャンプします。
1 {print}
next
コマンドの実行を引き起こさなかった各行を印刷します。 (1
常に真の条件です。)END {…}
入力の終わりに中かっこで囲まれたコードを実行します。- awkコードは一時ファイルに書き込み、その場所に移動します。