在10行awk脚本中,我需要将变量的内容分成数字变量和单位变量。这是一个简化的例子
~$ echo 139506MB | awk '{
ex = index("KMGTPEZY", substr($1, length($1)));
val = substr($1, 0, length($1) - 2);
print ex " " val
}'
0 139506
我知道单位部分总是2个字符,但由于某种原因ex
总是返回0
而不是MB
,正如我所希望的那样。
问题
知道为什么ex
不包含单位?
答案 0 :(得分:2)
使用GNU awk和split
的 seps 滥用.B
作为分隔符,以便在使用时将数字和单位与变量分开( GNU) awk :
$ echo 139506MB | awk '{split($1,a,/.B/,seps);print seps[1],a[1]}'
MB 139506
另外,关于您的代码:您(尝试)在字符串index
中设置M
的{{1}},因此我假设您正在寻找KMGTPEZY
。通过固定下面的ex==2
:
substr
也许您应该使用预期的输出更新OP。
答案 1 :(得分:2)
index()
函数中的逻辑错误,您提取的字符不是您定义的字符串的一部分。因此,您看到的返回值为0.
使用GNU Awk将捕获的组存储到数组的正则表达式方法。使用match()
功能,您可以执行以下操作。捕获的组存储在数组(ar
)中,您可以从中访问元素1和2。
echo 139506MB | gawk 'match($0, /([[:digit:]]+)([[:alpha:]]+)/, ary) {print ary[1] ary[2]}'
答案 2 :(得分:1)
第一个问题在这里:
substr($1, length($1))
您正在获取字符串的最后一个字符,即“B”。 “KMGTPEZY”中没有“B”,因此index
会返回0
。
我认为您根本不需要使用index
。使用substr
:
ex = substr($1, length($1) - 1);
val = substr($1, 0, length($1) - 2);
测试:
$ awk '{ print substr($1, length($1) - 1), substr($1, 0, length($0) - 2) }' <<< '139506MB'
MB 139506
答案 3 :(得分:1)
关注awk
也可以帮助您。
str="139506MB"
echo "$str" | awk '
match($0,/[0-9]+/){
val=substr($0,RSTART+RLENGTH);
if(val ~ /[a-zA-Z]+/){
print substr($0,RSTART,RLENGTH),val}
}'
答案 4 :(得分:1)
substr()
来电substr($1, length($1))
,只会返回$1
(B
)的最后一个字符。此字符不是字符串KMGTPEZY
的一部分。
$ echo '139506MB' | awk '{ n=$1+0; sub(n,"",$1); print $1,n }'
MB 139506
这使用了这样一个事实,即将字符串转换为数字会丢弃第一个非数字的所有内容。这允许我们使用n
将数字存储在$1+0
中(强制将第一个字段解释为数字)。然后,我们使用sub()
从原始行中删除该数字。然后打印数字和剩余文本。