web-dev-qa-db-ja.com

文字列変数をパラメータとしてawkに渡す方法

私は次のコマンドがあります:

usb_soundcard_sink=$(pactl list short sinks | grep "alsa_output" | awk '{ print $2 }' | tail -n1)

このコマンドの出力は次のとおりです。

alsa_output.pci-0000_00_1b.0.analog-stereo

そして、これはインデックス番号を見つける別のコマンドです:

var=$(pactl list short sinks | awk '$2=="alsa_output.pci-0000_00_1b.0.analog-stereo" {print $1}')

出力:

0

ただし、上記のコマンドで「alsa_output.pci-0000_00_1b.0.analog-stereo」のように、ハードコードされた値の代わりに「usb_soundcard_sink」変数を渡します。 「usb_soundcard_sink」変数のb'coz値は動的に変化する場合があります。

また、私は次を試しました:

var=$(pactl list short sinks | awk '$2=="$usb_soundcard_sink" {print $1}')

しかし、それは機能していません

上記のコマンドに「usb_soundcard_sink」変数の値をどのように渡すことができますか

4

Awk内でbash変数を使用するには、次のような-v構文を使用する必要があります。

pactl list short sinks | awk -v myvar="$usb_soundcard_sink" '$2==myvar {print $1}'
#                               ^^^^^                            ^^^^^
#                                 |________________________________|

$ a=3
$ awk -v myvar="$a" 'BEGIN{print myvar}'
3
17
fedorqui

これも機能することがわかりました

line=myfile.dat
f=8
s=11
echo $line | awk '{print $'$f',$'$s'}'

ここでは、8列目と11列目を吐き出すawkにパイプされたmyfile.datというファイルがあります。

4
User-Z

MAWK(UbuntuのデフォルトAWKバージョン)とGAWKは両方とも、identifier=value形式の非オプションのコマンドライン引数を変数割り当てとして読み取ります。これは、BEGINステートメントの実行直後に実行されます。

% echo | mawk -- '{print var}' var=foo 
foo
% echo | gawk -- '{print var}' var=foo
foo
% echo foo bar baz | mawk -- '{$1=$1}1' OFS=,
foo,bar,baz
% echo foo bar baz | gawk -- '{$1=$1}1' OFS=,
foo,bar,baz

-vオプションよりもこの方法の方が好きです。なぜなら、コマンドをより簡潔に保ち、インタープリターに渡すオプションとプログラムの詳細を明確に分離するからです。

man mawkから:

コマンドライン引数は、ファイル引数、割り当て引数、および空の文字列 ""の3つのセットに分かれています。割り当ての形式はvar = stringです。 ARGV [i]が可能なファイル引数として検査されるとき、空の場合はスキップされます。代入引数の場合、varへの代入が行われ、次の引数にスキップします。それ以外の場合、ARGV [i]は入力用に開かれます。

man gawkから:

コマンドラインのファイル名の形式がvar = valの場合、変数の割り当てとして扱われます。変数varには値valが割り当てられます。 (これは、BEGINルールが実行された後に発生します。)コマンドライン変数の割り当ては、AWKが入力をフィールドとレコードに分割する方法を制御するために使用する変数に値を動的に割り当てるのに最も役立ちます。また、単一のデータファイルで複数のパスが必要な場合に状態を制御するのにも役立ちます。

0
kos