根据第X个字段字符串更改CSV文件的第N个字段

时间:2013-05-10 19:09:00

标签: bash

我的文件如下:

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

我需要“如果第一个字段以”total“开头,则在第三个字段中输入”,所以我可以得到:

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

我熟悉sed sintax,但使用字段远非我的能力。可能awk更方便......

谢谢!

3 个答案:

答案 0 :(得分:4)

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

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

$1是第一个字段,我们检查它是否以total开头;如果是这样,我们将第三个字段设置为0。

1始终为true,它会导致打印行。

答案 1 :(得分:2)

sed solution

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

而不是-e-i将更改文件本身。

第一组\(...)\内的任何内容实际上是第一个字段,它会在\1被替换,然后[0-9]*是任何数字,由0取代,然后在最后\(;*\)表示如果存在任何其他字段,请将其替换为\2

答案 2 :(得分: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)