以下は私のファイルの最初の5行です。ここでは、5列目の「10,00,000.0」を「10,000,000.0」に変更したいと思います。
DE000A2200V7,09:30:00,8.5,8.509,"10,00,000.0","10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,"10,00,000.0","10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"
答え1
fromを使用してCSV区切り文字を@
(またはまだデータの一部ではない他の文字)に一時的に変更します。csvformat
csvkit
、5番目のフィールドで関連する文字列を変更し、次のように区切りawk
文字を元のコンマに戻します。
csvformat -D '@' data.csv |
awk 'BEGIN { OFS=FS="@" } $5 == "10,00,000.0" { $5 = "10,000,000.0" }; 1' |
csvformat -d '@'
データを使用すると、data.csv
次のような結果が得られます。
DE000A2200V7,09:30:00,8.5,8.509,"10,000,000.0","10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,"10,000,000.0","10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"
答え2
これを行うには、次のsed
コマンドを使用できます。
sed -i 's/^\(\([^,]*,\)\{4\}\)\("[^"]*"\)\(.*\)$/\1"10,000,000.0"\4/' data.csv
答え3
「20,00,000.0」は正しいですか?そうでない場合は、お試しください。
sed 's/,00,/,000,/' file
間違った数字をすべて修正する必要がある場合は、s
フラグを追加してください。g
答え4
GNUと共にawk
awk -vFPAT='([^,]*)|("[^"]+")' -vOFS=, '$5 == "\"10,00,000.0\"" \
{ $5="\"10,000,000.0\""}; {print}' file
テスト
$ cat file
DE000A2200V7,09:30:00,8.5,8.509,"10,00,000.0","10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,"10,00,000.0","10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"
$ awk -vFPAT='([^,]*)|("[^"]+")' -vOFS=, '$5 == "\"10,00,000.0\"" { $5="\"10,000,000.0\""}; {print}' file
DE000A2200V7,09:30:00,8.5,8.509,10,000,000.0,"10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,10,000,000.0,"10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"
説明する
-vFPAT='([^,]*)|("[^"]+")'
フィールドをコンマで区切り、フィールドにカンマを含めることができる場合を処理します(GNU awk マニュアルを参照)。コンテンツ別フィールドの定義)。
-vOFS=,
出力ファイル区切り文字がカンマであることを指定します,
。
'$5 == "\"10,00,000.0\"" { $5="\"10,000,000.0\""}; {print}'
5番目の列が文字列「10,00,000.0」と一致する場合は、「10,000,000.0」に置き換えてその行を印刷します。