我们使用以下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}'