AWK命令在不同的Ubuntu版本中给出不同的结果



我们使用以下awk命令来拆分字母数字文本中的数字和字母。

echo "1.5GB" |awk '{ gsub(/([[:alpha:]]+|[[:digit:].-]+|[^[:alnum:].-]+)/,"&n",$0) ; print "size="$1"nsymbol="$2}'

该命令在Ubuntu 20.04中给出所需的结果。结果是

size=1.5
symbol=GB

但在Ubuntu 18.04中,它给出了以下结果,这不是期望的结果

size=1.5GB
symbol=

1996年的mawk是awk的一个最小功能版本,旨在提高执行速度。它不符合POSIX,因此不应该期望它支持POSIX字符类。如果可能的话,获取一个新版本或更改此:

/([[:alpha:]]+|[[:digit:].-]+|[^[:alnum:].-]+)/

到此:

/([a-zA-Z]+|[0-9.-]+|[^a-zA-Z0-9.-]+)/

例如:

echo "1.5GB" |awk '{ gsub(/([a-zA-Z]+|[0-9.-]+|[^a-zA-Z0-9.-]+)/,"&n",$0) ; print "size="$1"nsymbol="$2}'
size=1.5
symbol=GB

我无法复制这个问题-我的所有awk的输出都以相同的哈希值结束:

% echo "1.5GB" | nawk '{ print NR,NF,$0,$1,$NF; gsub(/[[:alpha:]]+|[[:digit:].-]+|[^[:alnum:].-]+/,"&n",$0) ; print NR,NF,$0,$1,$NF }' | xxh128sum 
1b0095d0c4c02859a61a0ab5a3253b58  stdin
% echo "1.5GB" | mawk '{ print NR,NF,$0,$1,$NF; gsub(/[[:alpha:]]+|[[:digit:].-]+|[^[:alnum:].-]+/,"&n",$0) ; print NR,NF,$0,$1,$NF }' | xxh128sum
1b0095d0c4c02859a61a0ab5a3253b58  stdin
% echo "1.5GB" | mawk2 '{ print NR,NF,$0,$1,$NF; gsub(/[[:alpha:]]+|[[:digit:].-]+|[^[:alnum:].-]+/,"&n",$0) ; print NR,NF,$0,$1,$NF }' | xxh128sum
1b0095d0c4c02859a61a0ab5a3253b58  stdin
% echo "1.5GB" | gawk -be '{ print NR,NF,$0,$1,$NF; gsub(/[[:alpha:]]+|[[:digit:].-]+|[^[:alnum:].-]+/,"&n",$0) ; print NR,NF,$0,$1,$NF }' | xxh128sum
1b0095d0c4c02859a61a0ab5a3253b58  stdin
% echo "1.5GB" | gawk -ne '{ print NR,NF,$0,$1,$NF; gsub(/[[:alpha:]]+|[[:digit:].-]+|[^[:alnum:].-]+/,"&n",$0) ; print NR,NF,$0,$1,$NF }' | xxh128sum
1b0095d0c4c02859a61a0ab5a3253b58  stdin
% echo "1.5GB" | gawk -ce '{ print NR,NF,$0,$1,$NF; gsub(/[[:alpha:]]+|[[:digit:].-]+|[^[:alnum:].-]+/,"&n",$0) ; print NR,NF,$0,$1,$NF }' | xxh128sum
1b0095d0c4c02859a61a0ab5a3253b58  stdin
% echo "1.5GB" | gawk -Pe '{ print NR,NF,$0,$1,$NF; gsub(/[[:alpha:]]+|[[:digit:].-]+|[^[:alnum:].-]+/,"&n",$0) ; print NR,NF,$0,$1,$NF }' | xxh128sum
1b0095d0c4c02859a61a0ab5a3253b58  stdin

虽然不清楚mawk 1.3.4和1.3.3中的什么变化使您的代码工作,但如果意图将输入的数字部分显示为size,将字母部分显示为symbol,即使两个组件中的一个缺失,代码从一开始就存在逻辑缺陷,因为对CCD_ 7的调用使得它得到的任何字母或数字字符成为第一字段。例如,如果输入只是GB,那么您的代码将输出:

size=GB
symbol=

我认为这是不可取的。

更好的方法是从输入中删除字母部分,使其成为size,从输入中去除数字部分,使之成为symbol:

awk '{s=$0;sub(/[[:alpha:]]+/,"",s);sub(/[[:digit:].-]+/,"");print"size="s"nsymbol="$0}'

相关内容

最新更新