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

juud5qan  于 2022-11-02  发布在  其他
关注(0)|答案(3)|浏览(157)

我们使用下面的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=
xdnvmnnf

xdnvmnnf1#

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
o3imoua4

o3imoua42#

我无法复制这个问题-我所有的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
9q78igpj

9q78igpj3#

虽然不清楚mawk 1.3.4与1.3.3相比有什么变化使代码能够正常工作,但如果意图是将输入的数字部分显示为size,将字母部分显示为symbol,即使缺少了这两个部分中的一个,因为对gsub的调用使它获得的字母或数字字符成为第一个字段。例如,如果输入只是GB,则代码将输出:

size=GB
symbol=

我认为这不是我们想要的。
一个更好的方法是从输入中删除字母部分,使其成为size,并从输入中删除数字部分,使其成为symbol

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

相关问题