colを次の2桁のAmount
10進形式でフォーマットしようとしています。1000
1000.00
次のサンプルファイルがあります。
Bank|Branch|Comment|Amount|Extra1|Extra2
xyz|we||100||
xyz|we||100.1||
xyz|we|paid for inv# 34VM23-SEP-20|23459900.00||
xyz|errt||-230.0||
xyz|ss||234.78||
xyz|we|valid|990.2||
xyz|we|9922.9 paid|9922.9||
xyz|we||.9||
xyz|we||.0||
xyz|we||.00||
私はawk -F"|" '{OFS=FS}''{printf ("%.2f",$4) ; print }' test.csv
結果を得ようとしました。
0.00Bank|Branch|Comment|Amount|Extra1|Extra2
100.00xyz|we||100||
100.10xyz|we||100.1||
23459900.00xyz|we|paid for inv# 34VM23-SEP-20|23459900.00||
-230.00xyz|errt||-230.0||
234.78xyz|ss||234.78||
990.20xyz|we|valid|990.2||
9922.90xyz|we|9922.9 paid|9922.9||
0.90xyz|we||.9||
0.00xyz|we||.0||
0.00xyz|we||.00||
0.00
また、ヘッダー行を避け、元のファイルに置き換えたいと思います。正しい方向を教えてください。ありがとう
ベストアンサー1
あなたのawkコードに欠陥があります。まず、変更された値$ 4とライン全体を印刷します。
正しいバージョンは次のとおりです。awk -F"|" 'NR<=1{print $0;next} {{printf($1"|" $2"|"$3"|%.2f|"$5"|"$6"\n",$4)}}' test
$ awk -F"|" 'NR<=1{print $0;next} {{printf($1"|" $2"|"$3"|%.2f|"$5"|"$6"\n",$4)}}' test
bank|Branch|Comment|Amount|Extra1|Extra2
xyz|we||100,00||
xyz|we||100,00||
xyz|we|paid for inv# 34VM23-SEP-20|23459900,00||
xyz|errt||-230,00||
xyz|ss||234,00||
xyz|we|valid|990,00||
xyz|we|9922.9 paid|9922,00||
xyz|we||0,00||
xyz|we||0,00||
xyz|we||0,00||
未変更フィールドと必要に応じて変更されたフィールドの両方を印刷する必要があります4。最初の行を未処理のままにするには、NRをテストし、変更なしでその行を印刷してから2行目にnext
進みます。
編集する元のコマンドと私のバージョンが存在する10進数を保持せずに0に設定するため、私のawkバージョンに問題がある可能性があります。これがあなたに効果があると思います。どうやら私たちの近所の人々と関係があると思います。たとえば、私のコンピュータでは234.78
。234,00
別の解決策は次のとおりです。ポール・ペダントコメントは$ 4の値を直接変更して後で印刷することです。
plonky@sd-143012:~/work$ awk -F '|' '{ {OFS=FS} if (FNR > 1) $4 = sprintf ("%.2f", $4); print; }' test
bank|Branch|Comment|Amount|Extra1|Extra2
xyz|we||100,00||
xyz|we||100,00||
xyz|we|paid for inv# 34VM23-SEP-20|23459900,00||
xyz|errt||-230,00||
xyz|ss||234,00||
xyz|we|valid|990,00||
xyz|we|9922.9 paid|9922,00||
xyz|we||0,00||
xyz|we||0,00||
xyz|we||0,00||