awk は一度に複数の変数に割り当てます。

awk は一度に複数の変数に割り当てます。

文字列から2つの数値を取得し、それを使用して変数に割り当てようとしていますawkgawkこれは私が具体的に使用するものです)。 tmuxバージョン文字列のメジャーバージョン番号とマイナーバージョン番号を変数として抽出したいと思いますawk。たとえば、次のようになります。

  • 入力:tmux 2.8;maj == 2min == 8
  • 入力:tmux 1.9a;maj == 1min == 9
  • 入力:tmux 2.10;maj == 2min == 10

私の入力が標準入力から来ていると仮定すると、tmux -V現在は次のようになります。

tmux -V | awk '{
                  maj = +gensub(/([0-9]+)\..*/, "\\1", "g", $2);
                  min = +gensub(/.*\.([0-9]+).*/, "\\1", "g", $2);
                  # ...do something with maj and min...
               }'

これはうまくいきますが、多くのtmuxユーザーが知っているように、ファイルif-shellから.tmux.conf(私はこれを使いたかった)簡単に結果をもたらすことができます。本物構成ファイルの行がかなり長いため、スペースを節約するためにこれら2つの変数割り当てを1つのステートメントに結合する方法があるかどうか疑問に思います。あるいは、入力からこれら2つの変数を収集し、スペースを節約する別の方法があるかどうか疑問に思います。

私は次のことを考えています:

awk '{ maj, min = +gensub(/([0-9]+)\.([0-9]+).*/, "\\1 \\2", "g", $2); }'

... Pythonに似ていますが、特定の構文を使用するとawk他のものは可能ですか?

読みやすさは実際には問題ではなく、長さだけです。

答え1

GNU awkを使用しているので、3-arg形式を使用してmatch()複数のキャプチャグループを保存できます。

awk '
    match($0, /([0-9]+)\.([0-9]+)/, m) {maj=m[1]; min=m[2]; print maj, min}
' <<END
tmux 2.8
tmux 1.9a
tmux 2.10
END
2 8
1 9
2 10

https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html

答え2

これはgensub拡張なgawkので、他のawk実装では使用できません。また、単項演算子はすべての実装で数値変換を強制するわけではなく、+使いやすくなります。awk+ 0

ここでは、次のことができます。

tmux -V | awk -F '[ .]' '{maj = $2+0; min = $3+0; print maj, min}'

GNU拡張を使用しても問題ない場合は、awk次のようにすることもできます。

tmux -V | awk -v FPAT='[0-9]+' '{maj = $1; min = $2; print maj, min}'

答え3

バージョンを配列に分割できます。

awk '{ split($2, ver, /[.a-z]/) }'

ver[1]次に、代わりにを使用しmajてください。ver[2]min

区切り文字を追加すると、a-zバージョン番号からすべての小文字が削除されます。 (ここでは数値を明示的に抽出するので、他の解決策がより優れています。)

答え4

他のユーザーがこの回答を投稿しましたが、後で削除されました。私はこれが役に立つと思います:

このsplit()関数を使用してバージョン文字列を配列に分割し、合計ではなく別々にver合計にアクセスします(または単にこれらの変数に値を格納します)。ver[1]ver[2]majmin

tmux -V | awk '{ split($2, ver, /[.a-z]/); print ver[1], ver[2] }'

ここでの利点は拡張ではsplit()ないことです(オプションの4番目の引数は拡張ですが)。gawkseps

関連情報