2013-05-10 45 views
0

我的文件看起來像:根據X個字段字符串更改CSV文件的第N場

invoice;123;456 
invoice;789;012 
total;912;468 

我需要總「如果第一場通過啓動‘’,然後把零在第三場」,所以我可以得到:

invoice;123;456 
invoice;789;012 
total;912;0 

我對sed sintax很熟悉,但是使用字段遠沒有我的可能性。可能awk更方便...

謝謝!

回答

4
awk 'BEGIN {FS = ";"; OFS=";"; } $1 ~ /^total/ { $3 = 0 } 1' 

FS是輸入字段分隔符,OFS是輸出字段分隔符。

$1是第一個字段,我們檢查它是否以total開頭;如果是這樣,我們將第三個字段設置爲0.

1總是如此,它會導致打印行。

1

這裏有一個sed解決方案

sed -i 's/\(^total;.*;\)\(.*\)/\10/g' file 

(^total;.*;)(.*) -> (First group matches until the second semicolon)(Second group matches rest) 
\10 -> Replacement is \1 (first group) + 0 (zero) 
2

SED解決方案

sed -e 's/\(total;[0-9]\+;\)[0-9]*\(;*\)/\10\2/g' <file> 

,而不是-e-i會改變文件本身。

無論是第一套\(...)\裏面實際上是第一場和它能夠在\1代替,那麼[0-9]*是任何數字,這是由0,然後取代了過去的\(;*\)意味着,如果任何其他領域存在,把它放在\2

的地方