我的文件看起来像:
invoice;123;456
invoice;789;012
total;912;468
我需要“如果第一个字段以“总计”开头,则在第三个字段中输入零”,这样我可以得到:
invoice;123;456
invoice;789;012
total;912;0
我熟悉 sed sintax,但使用字段远非我的能力。可能awk更方便......
谢谢!
我的文件看起来像:
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 -e 's/\(total;[0-9]\+;\)[0-9]*\(;*\)/\10\2/g' <file>
而不是-e
,-i
将更改文件本身。
第一组中的任何\(...)\
内容实际上都是第一个字段,它被替换为\1
,然后[0-9]*
是任何数字,被替换为0
,最后\(;*\)
意味着如果存在任何其他字段,则将其替换为\2
这是一个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)