我想在多个文件中反转第x(2)列中数字的符号。例如:
这
1 | 2.0
2 | -3.0
3 | 1.0
要
1 | -2.0
2 | 3.0
3 | -1.0
我正在使用sed '/^-/ {s/.//;b};s/^/-/'
文件命令,但它不起作用。有什么建议吗?
答案 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