2016-09-14 12 views
0

私が取り組んでいる問題の縮小版です。awkでbashの展開変数を使用

私は情報を取得し、 "c"という名前のbash変数に格納するためにbashを使用しています。

echo {1..3} 
1 2 3 
echo \${1,2,3} 
$1 $2 $3 
c=$(echo \${1,2,3}) 
echo $c 
$1 $2 $3 

今、私はawkの文の中の変数「c」を使用したいが、知りたいと思ったことさえ可能であるか、私ははるかに現実から考えています。

echo a b c d e f g h |awk -v c=$"(echo \${1,2,3})" '{print c}' 
(echo ${1,2,3}) #This is not expected, instead a b c was. 

または

echo a b c d e f g h |awk -v c="$(echo \${1,2,3})" '{print c}' 
    $1 $2 $3 

私はawkの内部ループで使用してこれを行うことができます知っています。しかし私の要求では、私が関心のある列番号は完全にランダムなので、ループを使用することはできませんでした。これは、次の方法を使用できないようにします。同様

この

echo a b c d e f g h |awk '{print $1,$2,$3}' 
a b c 

またはこのような

echo a b c d e f g h |awk '{for(i=1;i<=3;i++) printf "%s ", $i}' 
a b c 

クエリ:

が知りたい場合は、その可能性のすべての列番号を格納することリスト/配列/変数とスロー彼らはawkで印刷するのですか?

注:

これは元のデータの実際の縮小版です。

+0

'c = $"(echo \ $ {1,2,3}) "'は '(echo $ {1,2,3})'を与えてください。 [これは間違いありません。](http://wiki.bash-hackers.org/syntax/quoting#i18nl10n) – anishsane

+0

なぜですか?あなたは '1'と' 3'をawkに渡し、awkをその範囲内の値のリストに展開することができます。 –

+0

ランダムですが、時には1〜3、6,7,8,10,12,13,14 .....です。だから私は、他の人がコードを維持するために、awk本文のリストからこれらの列番号をリストする必要があります。 –

答えて

3

私はこのような列番号の配列を渡すことをお勧め:シェルは別々のワードに配列の要素を分割しないように、私は${cols[*]}を使用してい

cols=({1..3}) 
awk -v a="${cols[*]}" 'BEGIN { n = split(a, cols) } 
    { for (i = 1; i <= n; ++i) printf "%s%s", $(cols[i]), (i<n?OFS:ORS) }' 

注意を。

+1

Eeks!とにかく '$ {cols [*]} 'の代わりに' $ {cols [@]} 'を使い、とにかく上書きしてしまったのを忘れてしまった。修正をありがとう。 – anishsane

+0

問題を解決するためのTomに感謝します。 –

+0

'$ 1、$ 2、$ 3'を文字列として渡した後、その文字列をawk' eval'にしたいと思うかもしれません。あなたの問題を解決するための別の方法がありますように! –

関連する問題