複数の列の数字の末尾に -(マイナス)記号を削除し、削除された列に挿入する必要があります

複数の列の数字の末尾に -(マイナス)記号を削除し、削除された列に挿入する必要があります

数字の末尾に-(マイナス)記号を持つ巨大なcsvファイルがあります。これで、マイナス記号を数字の先頭に移動する必要があります。つまり、最後の文字(「-」記号がある場合)を削除し、前に「-」記号を付ける必要があります。

0.00,70440.19-,18.31-,0.00,451.59-,13788.77-,44.19-,6289.29-
1.03-,39.24-,0.11-,16.96-,0.00,72377.70-,0.00,146673.67-,59.11-,0.00

次の方法を試しましたが、10進値 "."がある場合は、前にマイナス記号を追加します。

perl -pe 's#(\d{1,})(-)#$2$1#'g  file

出力は次のとおりです。

0.00,70440.-19,18.-31,0.00,451.-59,13788.-77,44.-19,6289.-29
1.-03,39.-24,0.-11,16.-96,0.00,72377.-70,0.00,146673.-67,59.-11,0.00

作業を実行する awk/sed/perl ライナーを提案してください。

ありがとう、ヴィーノ。

答え1

以下の解決策が機能します。他のawkまたはsedソリューションを知っておくと良いでしょう。

perl -pe 's#(\d{1,}[.]\d{1,})(-)#$2$1#'g  file

答え2

Perlコマンドと同じです。

$ sed 's/\([0-9]\+\.[0-9]\+\)-/-\1/g' file
0.00,-70440.19,-18.31,0.00,-451.59,-13788.77,-44.19,-6289.29
-1.03,-39.24,-0.11,-16.96,0.00,-72377.70,0.00,-146673.67,-59.11,0.00

もう一つのPerlの一行、

$ perl -pe 's/([^,\n]*?)-/-\1/g' file
0.00,-70440.19,-18.31,0.00,-451.59,-13788.77,-44.19,-6289.29
-1.03,-39.24,-0.11,-16.96,0.00,-72377.70,0.00,-146673.67,-59.11,0.00

答え3

別のパール

perl -F, -lane 'print join ",", map {(/-$/ && chop) . $_} @F' file

答え4

以下は一部です。

  1. 短いパール

    perl -pe 's/([\d.]+)-/-$1/g' file 
    
  2. (GNU) sed

    sed -r 's/([0-9.]+)-/-\1/g' file 
    
  3. すべてのsed

    sed 's/\([0-9.]*\)-/-1\1/g' file 
    
  4. ばかげて。様々なawkバリアントは、キャプチャモードに関連する操作にはあまり良くありません。 GNU awk(gawk)や他の人がこれを行うことができますが、私は上記の解決策の1つを使います。

    gawk -F, '{
                for(i=1; i<NF; i++){
                    if(sub(/-/,"",$i)){printf "-%s,",$i}
                    else{printf "%s,",$i}
                }
                if(sub(/-/,"",$NF)){print "-"$NF}
                else{print $NF} }' file 
    

    これを行うより良いawk方法が明らかになると確信していますが、上記の方法は見苦しくて面倒ですが、まだ機能します。

  5. 不必要に複雑

    perl -pe 's/\n/\n\n/; s/,/\n/g; ' file | 
        awk -F"-"  '/-/{printf "-";}{print $1}' | 
            perl -000ne 's/\n./,/g;s/\n\n/\n/g; print'
    

関連情報