2017-04-18 86 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 
相關問題