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

Sed 更改数字符号+;/-多个文件,sed,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/^/-/'file命令,但它不起作用。有什么建议吗?使用awk更“正确”地使用实际数学是很容易的。例如,如果要对第2列和第3列求反: awk '{print $1, -$2, -$3}' 使用awk更“正确”地使用实际数学是很容易的。例如,如果要对第2列和第3列求反: awk '{print $

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

1 | 2.0

2 |-3.0

3 | 1.0

1 |-2.0

2 | 3.0

3 |-1.0

我使用的是
sed'/^-/{s//;b};s/^/-/'
file命令,但它不起作用。有什么建议吗?

使用awk更“正确”地使用实际数学是很容易的。例如,如果要对第2列和第3列求反:

awk '{print $1, -$2, -$3}'
使用
awk
更“正确”地使用实际数学是很容易的。例如,如果要对第2列和第3列求反:

awk '{print $1, -$2, -$3}'
从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 -F'\|' -lane '$F[1] = -$F[1]; print join "|", @F' ip.txt 
1 |-2
2 |3
3 |-1
从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 -F'\|' -lane '$F[1] = -$F[1]; print join "|", @F' ip.txt 
1 |-2
2 |3
3 |-1

您提供的命令在GNU sed上为我工作,您得到的输出是什么?您的sed版本是什么?我的输出不变。我想更改我文件的第5列,那么我应该在哪里指出它,即使这样,您的输出也应该更改..我如何才能找到我正在使用的sed版本?请尝试
sed--version
。。。另外,您确实需要更改示例输入文件以反映多列和相关的预期输出。。。说
列x
很容易出错您提供的命令在GNU sed上对我有效,您得到的输出是什么?您的sed版本是什么?我的输出不变。我想更改我文件的第5列,那么我应该在哪里指出它,即使这样,您的输出也应该更改..我如何才能找到我正在使用的sed版本?请尝试
sed--version
。。。另外,您确实需要更改示例输入文件以反映多列和相关的预期输出。。。说
列x
很容易,我使用awk'{print$1、$2、$3}'旧的_文件>新的_文件,这很有效。但是,我不能应用于多个文件。我的意思是我应该如何循环awk@user3527941:您在shell中循环,而不是awk。例如,在bash中编写一个“while”或“for”循环,我使用awk'{print$1、$2、$3}'old_file>new_file,它成功了。但是,我不能应用于多个文件。我的意思是我应该如何循环awk@user3527941:您在shell中循环,而不是awk。例如,在bash中编写一个“while”或“for”循环。