awk一次分配给多个变量


9

我正在尝试从一个字符串中提取两个数值,并使用awk(将它们分配给变量)(gawk这正是我正在使用的)。我想从tmux版本字符串中提取主要和次要版本号到awk变量中,例如:

  • 输入:tmux 2.8; maj == 2min == 8
  • 输入:tmux 1.9a; maj == 1min == 9
  • 输入:tmux 2.10; maj == 2min == 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文件中使用(我希望在其中使用该东西)很容易导致config文件中的行长,所以我想知道是否有办法组合这两个变量分配到一个语句中以节省空间...或其他任何方式从输入中收集这两个变量并节省空间。

我在想类似的东西:

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

...有点像Python,但是该特定语法在中不存在awk。还有其他可能吗?

请注意,可读性并不是真正的问题,只是长度。

Answers:


9

请注意,这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}'

感谢您提供有关兼容性的其他说明!
villapx


5

您可以将版本分成一个数组:

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

然后用ver[1]代替majver[2]而不是min

添加a-z到分隔符会从版本号中删除所有小写字母。(这里的其他解决方案更好,因为它们明确地提取了数字。)


3

另一个用户发布了此答案,后来被删除。我认为这很有用:

使用该split()函数,将版本字符串拆分为一个数组ver,然后分别访问ver[1]ver[2]而不是maj和和min(或仅将值存储在这些变量中):

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

这里的优点是它split()不是gawk扩展名(尽管它的可选第四个参数seps是扩展名)。


+1,但为什么用它/[.a-z]/作为split字符串函数的第三个(字段分隔)参数,而不是"."
Cbhihe

2
@Cbhihe看到我的答案的解释(由于villapx认为它很有用,因此我不删除它,谢谢villapx!)。
史蒂芬·基特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.