印刷モードをawkに変数として渡す

印刷モードをawkに変数として渡す

変数を使用してawk個々の列を ,。印刷したい列とパターンは他の変数に保存されますb。パターンaと印刷はb次のとおりです。

a='15986327,415532694,850257614,875121642,20140819'
b='$1","$2","$4'

次の出力を取得しようとしています。

15986327,415532694,875121642

bスイッチを使ってパターンをawkに渡そうとしていますが、内部で使用する-v方法がわかりません。次のコマンドを試しましたが、これは私が得たい出力ではありません。printawk

echo $a |awk -v ba="${b}" -F"," '{print ba}'
$1","$2","$4

echo $a |awk -v ba="${b}" -F"," '{print $ba}'
15986327,415532694,850257614,875121642,20140819

答え1

変数を使用する必要はありませんba。以下を試してください。

$ echo $a | awk -F',' '{print '"$b"'}'
15986327,415532694,875121642

この方法は$bではなくシェルによって拡張されますawk。残りのステートメントはawk一重引用符で囲まれているため、影響を受けません。

答え2

awk変数は、ほとんどの言語の変数と同様に、その値にのみ使用され、式として再解析されません。これで好きなことができます:

a='15986327,415532694,850257614,875121642,20140819'
echo $a | awk -F, -v OFS=, '{print $1, $2, $4}'

OFS(出力にカンマが表示されるように設定してください)。b変数として必要な場合は、次のものを使用できます。

b='$1, $2, $4'
echo $a | awk -F, -v OFS=, "{print $b}"

代わりにb式の一部としてinを置き換えますawk


言ったように、awkこれは必要ありません。本当に仕事です。cut:

echo "$a" | cut -d, -f1,2,4

,コードを複雑に二重解析する必要なく、フィールド区切り文字として使用するフィールド1、2、4を選択します。これがcut私たちが設計した目的です。

関連情報