csvファイルの区切り文字を妨げないセミコロン区切り文字が含まれています。

csvファイルの区切り文字を妨げないセミコロン区切り文字が含まれています。

"、"区切り文字を中断せずに列の区切り線を強調表示するために区切り文字を含める必要があるCSVファイルがあります。

以下は現在のファイルのモデルです。

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

ファイルの区切り文字が「」なので、「.」を使用すると良いと思います。どのようにファイルをこのようにアーカイブできますか?

99999999,2021-01-01,I,0090922002,0000000000091026.29-,000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0091000002,0000000000632888.33+,000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0091100005,0000000000632888.33-,000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0091110002,0000000000632888.33-,000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0099999995,0000000080178971.39+,000000000000000000-,000000000000000000-,

答え1

awkを強制的に実行しない場合は、以下を使用してください。ミラー、小数点区切り文字でカンマを使用する場合

mlr --csv -N put -S '$5=sub($5,"(...)$",",\1")' input.txt

あなたのため

99999999,2021-01-01,I,0090922002,"0000000000091026,29-",000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0091000002,"0000000000632888,33+",000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0091100005,"0000000000632888,33-",000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0091110002,"0000000000632888,33-",000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0099999995,"0000000080178971,39+",000000000000000000-,000000000000000000-,

小数点区切り記号で点が必要な場合

mlr --csv -N put -S '$5=sub($5,"(...)$",".\1")' input.txt
99999999,2021-01-01,I,0090922002,0000000000091026.29-,000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0091000002,0000000000632888.33+,000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0091100005,0000000000632888.33-,000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0091110002,0000000000632888.33-,000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0099999995,0000000080178971.39+,000000000000000000-,000000000000000000-,

答え2

使用substr():

awk -F, '$5 = substr($5,1,length($5)-3) "." substr($5,length($5)-2)' OFS=,

答え3

$ awk 'BEGIN{FS=OFS=","} {sub(/...$/,".&",$5)} 1' file
99999999,2021-01-01,I,0090922002,0000000000091026.29-,000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0091000002,0000000000632888.33+,000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0091100005,0000000000632888.33-,000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0091110002,0000000000632888.33-,000000000000000000-,000000000000000000-,
99999999,2021-01-01,I,0099999995,0000000080178971.39+,000000000000000000-,000000000000000000-,

答え4

awkを使用する必要がない場合は、GoCSVの変えるこのコマンドは以下を処理できます。

gocsv replace -c 5 -regex '(\d{2}[+-])' -repl '.$1' input.csv

実際、あなたの例にはキャップがないので、キャップを追加して置き換えてからキャップを削除する必要があります。

gocsv cap --default-name 'Col' input.csv |
gocsv replace -c 5 -regex '(\d{2}[+-])' -repl '.$1' | 
gocsv behead

関連情報