使用awk时如何将数字和单位与变量分开

时间:2018-05-18 10:16:28

标签: linux awk

在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不包含单位?

5 个答案:

答案 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)),只会返回$1B)的最后一个字符。此字符不是字符串KMGTPEZY的一部分。

$ echo '139506MB' | awk '{ n=$1+0; sub(n,"",$1); print $1,n }'
MB 139506

这使用了这样一个事实,即将字符串转换为数字会丢弃第一个非数字的所有内容。这允许我们使用n将数字存储在$1+0中(强制将第一个字段解释为数字)。然后,我们使用sub()从原始行中删除该数字。然后打印数字和剩余文本。