1

次のような多くの行を含むファイルがあります。

 one     3456    orange
 two     6690    grape
 three   5570    apple
 four    6683    pear
 five    8847    cherry
 six     9035    banana

だから私はこの出力をキャッチするためにawkスクリプトを書きます:

apple banana cherry

次のようになります。

awk '/three/ { a = $3}; /six/ { b = $3}; /five/ { c = $3} END {print  a" " b" "c}' <file

しかし、これは私が使い続けているため、最善の方法ではありません$3-この変数をキャッチして再利用するにはどうすればよいですか?

4

1 に答える 1

2

あなたのようにそれをすることに特に悪いことは何もありません。変数を使用する場合は、それを繰り返す必要があります。ただし、配列を使用して値を累積することはできます。

単純な変数の使用例を次に示します。

awk '{var = $3} /three/ {a = var}; /six/ {b = var}; /five/ {c = var} END {print a, b, c}' file

配列を使用した例を次に示します。

awk '$1 ~ /^(three|six|five)$/ {arr[++c] = $3} END {for (i = 1; i <= c; i++) {printf "%s%s", delim, arr[i]; delim = OFS}; printf "\n"}' file

リダイレクションを使用する必要はありません。AWKはファイル名を引数として受け入れることができます。

ステートメントではprint、コンマがOFS(デフォルトではスペース)の値に置き換わるため、を使用する必要はありません" "

アレイバージョンでは、すべてが1つの場所にあるため、正規表現を簡単に変更できます。

于 2012-05-25T11:06:43.470 に答える