サーチ…


コマンドライン変数の割り当て

コマンド行から変数を割り当てるには、 -vを使用できます。

$ awk -v myvar="hello" 'BEGIN {print myvar}'
hello

等号の周りにスペースはないことに注意してください。

これにより、シェル変数を使用できます。

$ shell_var="hello"
$ awk -v myvar="$shell_var" 'BEGIN {print myvar}'
hello

また、 awkを制御する組み込み変数を設定することもできます:

FS (フィールドセパレータ)の例を参照してください。

$ cat file
1,2;3,4
$ awk -v FS="," '{print $2}' file
2;3
$ awk -v FS=";" '{print $2}' file
3,4

またはOFS (出力フィールドセパレータ)を使用します。

$ echo "2 3" | awk -v OFS="--" '{print $1, $2}'
2--3
$ echo "2 3" | awk -v OFS="+" '{print $1, $2}'
2+3

-vオプションを使用してプログラムにパラメータを渡す

オプション-v続けて、 variable = valueという形式を代入すると、 awkプログラムにパラメータを渡すことができます。これは、以下の罰則プログラムによって説明されています。その仕事は、標準出力で "私はクラスで話しません"という文章の数を数えることです。次の例では、100という値を使用しています。これは教師の間で非常に人気があります。

awk -v count=100 'BEGIN {
  for(i = 1; i <= count; ++i) {
    print("I shall not talk in class.")
  }
  exit
}'

-vフラグを繰り返し使用すると、複数のパラメータを渡すことができます。

awk -v count=100 -v "sentence=I shall not talk in class." 'BEGIN {
  for(i = 1; i <= count; ++i) {
    print(sentence)
  }
  exit
}'

配列やリストのパラメータの組み込みサポートはありません。これらは手動で処理する必要があります。リストパラメータを渡すために古典的なアプローチは、区切り文字を使用してリストを連結することで、人気のある選択肢があります:|または,split関数は、リストをawk配列として復元することを可能にします:

awk -v 'serialised_list=a:b:c:d:e:f' 'BEGIN {
  list_sz = split(serialised_list, list, ":")
  for(i = 1; i <= list_sz; ++i) {
    printf("list: %d: %s\n", i, list[i])
  }
  exit
}'

このawkプログラムの出力は

list: 1: a
list: 2: b
list: 3: c
list: 4: d
list: 5: e
list: 6: f

awk配列のキーとしてリスト項目を復元するほうが便利な場合があります。これは簡単なメンバーシップ検証を可能にするためです。たとえば、次のプログラムは、最初の単語が例外の固定リストに属していない各行を出力します。

awk -v 'serialised_exception_list=apple:pear:cherry' 'BEGIN {
  _list_sz = split(serialised_exception_list, _list, ":")
  for(i = 1; i <= _list_sz; ++i) {
    exception[_list[i]]
  }
}

! ($1 in exception) { print }' <<EOF
apple Apples are yummy, I like them.
pineapple Do you like pineapple?
EOF

このプログラムの出力は

pineapple Do you like pineapple?

最後の例として、 罰則プログラムをシェルスクリプトにラップする方法を示します。シェルスクリプトが補助awkスクリプトにどのようにパラメータを伝えるかを示しています。

#!/bin/sh

usage()
{
   cat <<EOF
Usage: punishment [-c COUNT][-s SENTENCE]
 Prepare your punishments for you
EOF
}

punishment_count='100'
punishment_sentence='I shall not talk in class.'
while getopts "c:hs:" OPTION; do
  case "${OPTION}" in
    c) punishment_count="${OPTARG}";;
    s) punishment_sentence="${OPTARG}";;
    h) usage; exit 0;;
    *) usage; exit 64;;
  esac
done

awk -v "count=${punishment_count}" -v "sentence=${punishment_sentence}" 'BEGIN {
  for(i = 1; i <= count; ++i) {
    print(sentence)
  }
  exit
}'

ローカル変数

awk言語は、関数のローカル変数を直接サポートしていません。ただし、関数に余分な引数を追加することで簡単にエミュレートできます。これらの変数に_を付けて接頭辞を付けると、実際のパラメータではないことが伝統的です。

このテクニックは、文字列を一重引用符でsingle_quote関数の定義で説明しています。

# single_quote(TEXT)
#  Return a string made of TEXT surrounded by single quotes

function single_quote(text, _quote) {
  _quote = sprintf("%c", 39)
  return sprintf("%s%s%s", _quote, text, _quote);
}

sprintf("'%s'", text)を使用するより簡単な方法は、 awkスクリプトが通常は単一引用符で囲まれた引数としてawkプログラムに渡されるため、実際的な問題につながりsprintf("'%s'", text)

代入引数

代入引数はawk呼び出しの最後にファイル変数と同じ領域に現れ、 -v代入と引数代入は次の正規表現と一致する必要があります。 (POSIXロケールを想定)

^[[:alpha:]_][[:alnum:]_]*=

次の例では、次の内容を含むファイル・fileを想定しています1 2 3 (空白で区切られた)

$ awk '{$1=$1}1' file OFS=, file OFS=- file
1 2 3
1,2,3
1-2-3


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow