更改数字+/-多个文件的符号

时间:2016-11-04 14:06:41

标签: sed

我想在多个文件中反转第x(2)列中数字的符号。例如:

  

1 | 2.0

     

2 | -3.0

     

3 | 1.0

  

1 | -2.0

     

2 | 3.0

     

3 | -1.0

我正在使用sed '/^-/ {s/.//;b};s/^/-/'文件命令,但它不起作用。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

awk使用实际数学更加“正确”。例如,如果您想要否定第2列和第3列:

awk '{print $1, -$2, -$3}'

答案 1 :(得分:0)

$ cat ip.txt 
1 | 2.0
2 | -3.0
3 | 1.0

从OP修改sed命令,不适合轻松修改其他列或不同的分隔符

$ sed -E '/^(.*\|\s*)-[0-9]/ {s/^(.*\|\s*)-/\1/;b}; s/^(.*\|\s*)/&-/' ip.txt 
1 | -2.0
2 | 3.0
3 | -1.0

使用perl更容易指定分隔符并修改特定列

$ perl -F'\|' -lane '$F[1] =~ m/-/ ? $F[1] =~ s/-// : $F[1] =~ s/\d/-$&/; print join "|", @F' ip.txt 
1 | -2.0
2 | 3.0
3 | -1.0


要在文件夹中修改多个文件,请使用-i选项

sed -i -E '/^(.*\|\s*)-[0-9]/ {s/^(.*\|\s*)-/\1/;b}; s/^(.*\|\s*)/&-/' *

perl -i -F'\|' -lane '$F[1] =~ m/-/ ? $F[1] =~ s/-// : $F[1] =~ s/\d/-$&/; print join "|", @F' *


如果数字格式不是问题,

$ perl -F'\|' -lane '$F[1] = -$F[1]; print join "|", @F' ip.txt 
1 |-2
2 |3
3 |-1