2016-05-04 13 views
1

私はこの.csvファイルから特定のセルを印刷するためのbashステートメントを持っています。変数をパラメータとしてAWKの{print}に使用できますか?

set `cat $filename | awk -v FS=',' '{print $2}' | head -5 | tail -n 1` 

'{print $2}'部分列を決定し、head -5部分が行を決定します。

$2(例えば、'{print $counter}')の代わりに$counter変数を代用できますか?

+1

はい。 'awk'は入力としてファイル名を取るので、' cat'を経由するパイプは少し役に立たないことにも注意してください。 – Bernhard

+0

'head -5' ...' head -n 5'に置き換える必要があります。 –

+0

'counter'を設定しないと、' counter 'は0として扱われるので '$ 0'が出力されます。 'counter'を列番号に設定すると、' print $ counter'は 'print'が実行されたときに現在の' counter'の値で示される列番号を出力します。ですから、入力の列Nを 'N = 5;で入力することができます。 awk -v N = "$ N" '{print $ N}' '(この例ではN = 5)。 –

答えて

1

答えは「はい」です。あなたが望むことを行うにはいくつかの方法があります。適切な方法は、-vを使用してawkの変数を宣言することです:

awk -F',' -v c=$counter 'NR==6 { print $c; exit }' "$filename" 

(あなたが安全に AWK "$filename"を渡すため、およびため、AWKに全力を尽くすために周りいくつかのことを移動するための私を許しますsetとバックチックを取り除く - それは原因で何もしていませんでした)。

これを行う別の方法は、シェルのクォートルールを活用したやり方の「ちょっとした」方法です。この方法は、いくつかは、最初の$文字が(それはのawkに意図フィールドを参照)、シェルによって解釈されていないことを確認するために、エスケープが必要です... bashの(およびPOSIX SH)で、次の作品:

awk -F',' "NR==6 { print \$$counter; exit }" "$filename" 
+0

それはenouhgではありません: 'NR == 6 {print $ c;出口; } '? –

+0

それは...良い提案です!私は私の答えを修正します.... –

+0

私のコードの冗長性を減らしていただきありがとうございます。私はたくさんのことを学んだ。 – jeremybcenteno

0

はい、すべてのパイプを取り外すことができました。変数はawk-v var=valueで渡されます。

このテスト済みのバージョンを試してください。 colrow変数に値を提供します

set $(awk -F "," -v col=2 -v row=5 'NR==row {print $col; exit}' "${filename}") 

$(command)は、この後には廃止され、command` `に好まれています。

NRは、現在の行番号です。

"${filename}"は、シェルによってその値に展開されます。ファイル名に特殊な文字が含まれていると、二重引用符が役立ちます。

+0

はテスト済みのバージョンで更新され、シェル端末からコピー+ペーストされます。 –

関連する問題