2017-04-18 82 views
1

我的问题是无法输出FS集作为正则表达式处理文件。 我有,我要像对待一个文件: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,但它也不起作用。

感谢您的任何提示。

+1

您正在使用哪种awk? –

+0

@JamesBrown无所谓你无法将OFS设置为未知数字。 – 123

+1

@ 123不要破坏它。我只读了第一句话。 :D –

回答

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 
+0

Sundeep,感谢使用'split'功能的好主意! – MirrG

+0

@孙德普,为什么最后1? – airos

+1

@airos在条件打印后,如果没有指定块,则awk中的任何非零数字都将计算为true,并执行默认操作。所以基本上它只是打印行。 – 123

2

乘以GAWK可以捕捉到字段分隔符(类似到RT)在分裂函数的gawk-only额外参数中:

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 
相关问题