awk FS是一个正则表达式

时间:2017-04-18 09:35:46

标签: bash awk

我的问题是无法输出经过处理的文件,并将FS设置为正则表达式。 我有一个我必须处理的文件:

id 1:1 2:1 3:2 5:1
id 1:2 3:1 4:1

我希望将值乘以(''之后)2:

id 1:2 2:2 3:4 5:2
id 1:4 3:2 4:2

我试过了:

awk 'BEGIN {FS=" [[:digit:]]+:"}{OFS=FS}{for (i=2; i<=NR;i++) $i=$i*2; print}' file

然而,它给了我文字[[:digit:]]+:作为FS。我在这里重做了一个类似的问题并尝试将字段设置为记录,最后打印$0, RT,但它也没有用。

感谢您的任何提示。

2 个答案:

答案 0 :(得分:4)

您可以使用split功能

$ awk '{for(i=2; i<=NF; i++){split($i,a,":"); a[2]*=2; $i=a[1]":"a[2]}} 1' file
id 1:2 2:2 3:4 5:2
id 1:4 3:2 4:2


或者更简单的perl解决方案,其中:之后的所有数字都乘以2

$ perl -pe 's/:\K\d+/$&*2/ge' file
id 1:2 2:2 3:4 5:2
id 1:4 3:2 4:2

答案 1 :(得分:2)

使用gawk,你可以在split函数的gawk-only额外参数中捕获字段分隔符(类似于RT):

BEGIN {FS=" [[:digit:]]+:"}

{
    split($0,a,FS,seps);
    printf "%s", a[1];
    for (i=2; i<=length(a); ++i)
      {printf "%s%s", seps[i-1], a[i]*2}
    print ""
}

$ awk -f mirr.awk mirr.txt
id 1:2 2:2 3:4 5:2
id 1:4 3:2 4:2
相关问题