2016-11-04 7 views
1

複数のファイルのx(2)列の数字の符号を反転したいと考えています。たとえば、次のように数字の符号を変更する+/-複数のファイル

1から| 2.0

2 | -3.0

3 | -2.0

2 | | 3.0

3 | 1.0

1 -1.0

私はsed '/^-/ {s/.//;b};s/^/-/' fileコマンドを使用していますが、それはしません作業。なにか提案を?

+1

コマンドあなたを使用し、インプレースフォルダ内の複数のファイルを変更するにはGNU sedで私の作品を提供しました。あなたが得た成果は?あなたのsed版は何ですか? – Sundeep

+0

私の出力は変わりません。ファイルの第5列を変更したいのですが、 – user3527941

+0

と出力が変更されるべき場所はどこですか? – Sundeep

答えて

0

awkを使用すると、実際の数式を使用してより適切な方法が簡単になります。たとえば、あなたが列2と3を否定したい場合:

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

私はawk '{print $ 1、 - $ 2、 - $ 3}' old_file> new_fileを使っていました。しかし、私は複数のファイルには適用できません。 – user3527941

+0

私はawkでどのようにループするべきですか? – user3527941

+0

@ user3527941:awkではなく、シェルをループします。たとえば、bashに "while"や "for"ループを書いてください。 –

0
簡単 perl場所で別の列または別の区切り文字

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

のために変更するのに適していない、OPからsedコマンドを変更

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

区切り文字を指定して特定の列を変更する方が簡単です

$ 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 
関連する問題