印刷する列を指定する文字列をawkにどのように渡しますか?

印刷する列を指定する文字列をawkにどのように渡しますか?

スペースで区切られた列が多いファイルがあります。いくつかの数値基準に基づいて特定の列を動的に印刷したいと思います。たとえば、

]$ cols=$(for i in `seq 1 3`; do echo -n "\$$[$[i-1]*6+1],\$$[$[i-1]*6+2],\$$[$[i-1]*6+3],\$$[$[i-1]*6+4+66],\$$[$[i-1]*6+5+66],\$$[$[i-1]*6+6+66],"; done)

これにより、印刷したい列が表示されます。

]$ echo ${cols%?}
$1,$2,$3,$70,$71,$72,$7,$8,$9,$76,$77,$78,$13,$14,$15,$82,$83,$84

awkに文字列として渡すと、欲しいものが得られません。

]$ awk -v cols=${cols%?} '{print cols}' file-testawk | head -2
$1,$2,$3,$70,$71,$72,$7,$8,$9,$76,$77,$78,$13,$14,$15,$82,$83,$84
$1,$2,$3,$70,$71,$72,$7,$8,$9,$76,$77,$78,$13,$14,$15,$82,$83,$84 

awkはそれを列識別子ではなく文字列として扱います。

正しく認識された方法で印刷するためにawkに列リストをどのように渡しますか?私は次のように単純で約1行の解決策を探しています。

cols=$(for i in `seq 1 3`; do echo -n "\$$[$[i-1]*6+1],\$$[$[i-1]*6+2],\$$[$[i-1]*6+3],\$$[$[i-1]*6+4+66],\$$[$[i-1]*6+5+66],\$$[$[i-1]*6+6+66],"; done); awk -v cols=${cols%?} '{print cols}' file-testawk > file.out

ベストアンサー1

awkには評価に似た機能はありませんが、awk -fbashプロセスの置き換えと組み合わせた機能(ファイルからスクリプトを読み取る)を使用してトリックを実行できます。

$ a="\$1,\$4"
$ echo "$a"
$1,$4
$ a="{print $a}"
$ echo "$a"
{print $1,$4}
$ awk -f <(echo "$a") <<<"one two three four five"
one four

おすすめ記事