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


9

私は文字列から2つの数値を引き出し、それらを使用して変数に割り当てようとしていますawkgawk私が特に使用しているものです)。tmuxバージョン文字列からメジャーバージョン番号とマイナーバージョン番号をawk変数に取り出したい:

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

私の入力がtmux -Vstdin からのものであると仮定すると、私は現在次のものを持っています:

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。他に可能なことはありますか?

読みやすさは本当に問題ではなく、長さだけに注意してください。

回答:


9

これgensubgawk拡張機能であり、他の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}'

互換性に関する追加の説明をありがとう!
villapx


5

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

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

その後、使用ver[1]の代わりにmajver[2]代わりにmin

a-zセパレータに追加すると、バージョン番号から小文字が削除されます。(他のソリューションは明示的に数値を抽出するため、ここではより優れています。)


3

別のユーザーがこの回答を投稿したため、後で削除されました。私はそれが便利だと思いました:

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

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

ここでのプラスは、それsplit()gawk拡張ではないことです(オプションの4番目の引数sepsは拡張です)。


+1だけでなく、なぜ文字列関数/[.a-z]/の3番目の(フィールド分離)引数として使用するのですか?split"."
Cbhihe

2
@Cbhiheは私の回答の説明を参照してください(villapxは便利だと思ったので、元に戻しました。villapxに感謝します!)。
Stephen Kitt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.