awk + ​​awkに変数を設定する

awk + ​​awkに変数を設定する

次の簡単なbashスクリプトは(ファイル内list.txt)行番号を印刷します。

function get_row

{ 
  
[[ $1 = 1 ]] &&  awk '{print $1}' list.txt
[[ $1 = 2 ]] &&  awk '{print $2}' list.txt
 
} 


get_row 1
get_row 2

しかし、もう少しエレガントに書きたかったです。

変数として関数を呼び出すと、変数が値を取得するように$1変数を設定できますか?awk '{print $val}'get_row 1$val1

答え1

このようなことをしたいですか?

function get_column
{ 
    awk -v val=$1 '{print $val}' list.txt
}

$1上記は、返されて関数に渡される列の一致です。$1from関数の行番号と一致する行を印刷する必要がある場合は、代わりに次のように使用してください。

function get_row
{ 
    awk -v val=$1 'NR==val{print ; exit}' list.txt
}

または、シェルに次のようにval値を計算して設定し、値を印刷させますawk

function get_column
{ 
    awk '{print $val}' val=$1 list.txt
}
function get_row
{ 
    awk 'NR==val{print ; exit}' val=$1 list.txt
}

ここではval数字だけを渡します。val以下を含む場合バックスラッシュ文字をエスケープする際に問題が発生します。awk渡された値に対してCエスケープシーケンスを実行し、-v val=シェル変数withはbyの値val="\\n"に変更されます。\nアッ

答え2

あなたはそれを使用することができます:

field=$1 awk '{print $ENVIRON["field"]}'

すべてのPOSIX互換システムで動作し、使用時にコードの挿入を心配する必要はありません。-v val=

get_columnまた、関数名はget_row

関連情報