不同Ubuntu版本中AWK拆分命令执行结果不一致的问题求助
解决Ubuntu不同版本下awk拆分数字与字母的兼容性问题
Ubuntu 18.04默认搭载GNU awk 4.1,而20.04使用的是GNU awk 4.2+,两者在gsub处理换行分割字段的逻辑上存在差异——4.1版本不会在gsub插入换行后自动重新分割$0为多个字段,所以原命令里$1仍是完整的"1.5GB",$2为空。
下面是两种兼容所有GNU awk版本的解决方案:
方案一:使用match数组捕获(推荐)
直接通过正则分组匹配提取数字和字母部分,行为在各版本一致:
echo "1.5GB" | awk '{ match($0, /^([[:digit:].-]+)([[:alpha:]]+)$/, arr); print "size=" arr[1] "\nsymbol=" arr[2] }'
在Ubuntu 18.04/20.04执行都会得到:
size=1.5 symbol=GB
这里的正则^([[:digit:].-]+)([[:alpha:]]+)$严格匹配开头的数字(含小数点、负号)和后续的字母,确保捕获准确。
方案二:用RSTART/RLENGTH提取(兼容更老awk)
如果你的awk不支持match的数组参数,可通过位置信息提取:
echo "1.5GB" | awk '{ if (match($0, /[[:alpha:]]+/)) { size = substr($0, 1, RSTART-1) symbol = substr($0, RSTART) print "size=" size "\nsymbol=" symbol } }'
该写法同样能在两个版本中得到预期结果。
内容的提问来源于stack exchange,提问作者Gautham
相关产品推荐
相关产品推荐

