awk / sed在分号分隔文件中将正值转换为负值

时间:2014-02-26 14:08:32

标签: replace sed awk gsub

我有一个像这样构建的文件:

1233;mc3; limit;1
946;mc3; limit;14545
0843;mc3; limit;2
443;mc3;Short  ;1012
1309;mc3;Short  ;1
1247;mc3;Short  ;1121
989;mc3;Short  ;1
1340;mc3;Short  ;14545
170;mc3;Short  limit;1
105964;mc3; rep;2000000
4934;mc3; rep;1
3028;mc3; rep;14545

我唯一知道的是,每个人都是';'分离。

我想将第四列中的值编辑为否定值。在文件中,此值始终为正值。

到目前为止,我想出的是:

[usr@serv] cat list | awk -F";" '{gsub ("^","-",$4);print}'
123213 mc  limit -1
946 mc  limit -14545
08743 mc  limit -2
4493 mc Short   -1012
13009 mc Short   -1
12147 mc Short   -1121
9989 mc Short   -1
13490 mc Short   -14545
1780 mc Short  limit -1
1054964 mc  rep -2000000
49324 mc  rep -1
30828 mc  rep -14545

但是你可以看到它删除了“;”。我在这做错了什么?

如果我使用awk或sed,或者我编辑原始文件或将其打印到新文件,对我来说并不重要。我只想在第三个“;”之后转换值。

3 个答案:

答案 0 :(得分:3)

rev filename | sed 's/;/-;/' | rev

答案 1 :(得分:2)

您遗失OFS设置为;。你也可以这样做:

awk -F\; '{$4=0-$4}8' OFS=\; file
1233;mc3; limit;-1
946;mc3; limit;-14545
0843;mc3; limit;-2
443;mc3;Short  ;-1012
1309;mc3;Short  ;-1
1247;mc3;Short  ;-1121
989;mc3;Short  ;-1
1340;mc3;Short  ;-14545
170;mc3;Short  limit;-1
105964;mc3; rep;-2000000
4934;mc3; rep;-1
3028;mc3; rep;-14545

答案 2 :(得分:1)

sed 's/\([0-9]*$\)/-\1/' filename