我的文件看起來像:根據X個字段字符串更改CSV文件的第N場
invoice;123;456
invoice;789;012
total;912;468
我需要總「如果第一場通過啓動‘’,然後把零在第三場」,所以我可以得到:
invoice;123;456
invoice;789;012
total;912;0
我對sed sintax很熟悉,但是使用字段遠沒有我的可能性。可能awk更方便...
謝謝!
我的文件看起來像:根據X個字段字符串更改CSV文件的第N場
invoice;123;456
invoice;789;012
total;912;468
我需要總「如果第一場通過啓動‘’,然後把零在第三場」,所以我可以得到:
invoice;123;456
invoice;789;012
total;912;0
我對sed sintax很熟悉,但是使用字段遠沒有我的可能性。可能awk更方便...
謝謝!
awk 'BEGIN {FS = ";"; OFS=";"; } $1 ~ /^total/ { $3 = 0 } 1'
FS
是輸入字段分隔符,OFS
是輸出字段分隔符。
$1
是第一個字段,我們檢查它是否以total
開頭;如果是這樣,我們將第三個字段設置爲0.
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)
SED解決方案
sed -e 's/\(total;[0-9]\+;\)[0-9]*\(;*\)/\10\2/g' <file>
,而不是-e
,-i
會改變文件本身。
無論是第一套\(...)\
裏面實際上是第一場和它能夠在\1
代替,那麼[0-9]*
是任何數字,這是由0
,然後取代了過去的\(;*\)
意味着,如果任何其他領域存在,把它放在\2