0

我的文件看起来像:

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

我需要“如果第一个字段以“总计”开头,则在第三个字段中输入零”,这样我可以得到:

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

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

谢谢!

4

3 回答 3

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

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

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

1总是正确的,它会导致打印行。

于 2013-05-10T19:14:26.370 回答
2

sed 解决方案

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

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

第一组中的任何\(...)\内容实际上都是第一个字段,它被替换为\1,然后[0-9]*是任何数字,被替换为0,最后\(;*\)意味着如果存在任何其他字段,则将其替换为\2

于 2013-05-10T19:30:23.810 回答
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)
于 2013-05-10T19:30:22.597 回答