4

複数の列のデータを含む大きなテキスト ファイルがあります。コマンドラインから列番号とキーワードを受け取り、一致する行全体を表示する前にヒットを検索するスクリプトを作成しようとしています。

私は次の行に沿って何かを試してきました:

grep $fileName | awk '{if ($'$columnNumber' == '$searchTerm') print $0;}'

しかし、これはまったく機能しません。私は正しい線にいますか?助けてくれてありがとう!

4

2 に答える 2

2

-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

于 2012-04-29T23:27:43.210 に答える
0

十分に合理的に見えます。set -xに渡されているものを正確に確認するために を使用してみてくださいawk。別の grep を取り除くなど、別の、および/またはより多くの awk を使用することもできます。

awk -v colnum=$columnNumber -v require="$searchTerm"
    "/$fileName/ { if (\$colnum == require) print }"

これは、awk 変数 (この場合は と ) を設定し、リテラル文字列を使用しcolnumて目的のフィールドを取得し、変数を使用して必要な文字列を取得することで機能します。require$colnumrequire

すべての場合 (grepコマンドの有無にかかわらず) の正規表現メタ文字は$fileNamemeta-y になることに注意してください。たとえば、という名前のファイルだけでなく、this.thatという名前のファイルにも一致します。this.thatthisXthat

于 2012-04-29T23:27:29.073 に答える