CSVファイルの位置演算子の変更

CSVファイルの位置演算子の変更

PostgresにインポートできるようにCSVファイルを編集しています。この時点で、その列の左側の列5の値が負の「-」のときに演算子を変更したいと思います。 「+」の演算子を削除したい。

現在のCSV:

10013534,2021-01-01,I,0090922002,000000000009102629+,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091000002,000000000063288833-,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091100005,000000000063288833-,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091110002,000000000063288833+,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0099999995,000000008017897139-,000000000000000000-,000000000000000000-,

それはどんな姿でなければなりませんか

10013534,2021-01-01,I,0090922002,000000000009102629,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091000002,-000000000063288833,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091100005,-000000000063288833,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091110002,000000000063288833,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0099999995,-000000008017897139,000000000000000000-,000000000000000000-,

必要に応じて、列6と7を削除します。

答え1

このような:

awk -F "," '{sign=substr($5,length($5),1);$5=substr($5,0,length($5)-1); if(sign =="-"){$5="-"$5}; print}' ./mycsv

答え2

試してみたいかもしれません

function movesign (TMP) {IX  = sub (/\+$/, "&", TMP)       # create increment based on sign, so
                                                           # to drop the plus signs
                         return substr (TMP TMP, length(TMP) + IX, length(TMP) - IX)
                                                           # by writing the string twice, and chop-
                                                           # ping it off at the right position with
                                                           # the right length, we get the desired result
                        }                       

/^#/    {pfx = substr($0, 8, 7) OFS substr($0, 32, 4) "-" substr($0, 30, 2) "-01" OFS substr($0, 36) 
                                                           # prepare prefix from header lines
         sub (/ *$/, "", pfx)                              # trim trailing spaces
         next
        }
/^@/    {next
        }

        {gsub(/[+-]/, "&,")                                # massage the input line into the right shape
          sub(/[, ]*$/, "")
         gsub(/  */, ",")

         $1 = pfx OFS $1                                   # prepend the prefix
         $0 = $0                                           # and recalculate the fields

         $5 = movesign($5)                                 # use function to taste
#        $6 = movesign($6)
#        $7 = movesign($7)
        }
1
' OFS=, *.csv

これまでに得た回答を盗みますが、一気に効果があるはずです.csvcwdコメントのロジックを確認し、問題がある場合はもう一度お試しください。

答え3

構造が同じままで、列5が10を超える整数文字を含むコンマの後の最初の一致であると仮定すると、文字が見つかった場合はダッシュを移動し、文字が見つかった場合はダッシュを除いsedてこれを試すことができます。-+

$ sed 's/,\([0-9]\{10,\}[^,]*\)\(-\)\|+,/,\2\1/' input_file
10013534,2021-01-01,I,0090922002,000000000009102629,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091000002,-000000000063288833,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091100005,-000000000063288833,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091110002,000000000063288833,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0099999995,-000000008017897139,000000000000000000-,000000000000000000-,

関連情報