Sed 更改数字符号+;/-多个文件
我想在多个文件中反转x(2)列中的数字符号。例如: 从 1 | 2.0 2 |-3.0 3 | 1.0 到 1 |-2.0 2 | 3.0 3 |-1.0 我使用的是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 $
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”循环。