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
これまでに得た回答を盗みますが、一気に効果があるはずです.csv
。cwd
コメントのロジックを確認し、問題がある場合はもう一度お試しください。
答え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-,