複数の列のデータを含む大きなテキスト ファイルがあります。コマンドラインから列番号とキーワードを受け取り、一致する行全体を表示する前にヒットを検索するスクリプトを作成しようとしています。
私は次の行に沿って何かを試してきました:
grep $fileName | awk '{if ($'$columnNumber' == '$searchTerm') print $0;}'
しかし、これはまったく機能しません。私は正しい線にいますか?助けてくれてありがとう!
-v オプションを使用して、コマンドにシェル変数を渡すことができますawk
。
以下はあなたが探しているものかもしれません:
awk -v s=$SEARCH -v c=$COLUMN '$c == s { print $0 }' file.txt
編集:
私は常に、よりエレガントでタイトなコードを書こうとしています。デニスの意味は次のとおりです。
awk -v s="$search" -v c="$column" '$c == s { print $0 }' file.txt
十分に合理的に見えます。set -x
に渡されているものを正確に確認するために を使用してみてくださいawk
。別の grep を取り除くなど、別の、および/またはより多くの awk を使用することもできます。
awk -v colnum=$columnNumber -v require="$searchTerm"
"/$fileName/ { if (\$colnum == require) print }"
これは、awk 変数 (この場合は と ) を設定し、リテラル文字列を使用しcolnum
て目的のフィールドを取得し、変数を使用して必要な文字列を取得することで機能します。require
$colnum
require
すべての場合 (grep
コマンドの有無にかかわらず) の正規表現メタ文字は$fileName
meta-y になることに注意してください。たとえば、という名前のファイルだけでなく、this.that
という名前のファイルにも一致します。this.that
thisXthat