ファイルの特定の列にある数値の内部書式設定[閉じる]

ファイルの特定の列にある数値の内部書式設定[閉じる]

colを次の2桁のAmount10進形式でフォーマットしようとしています。10001000.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.78234,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||

おすすめ記事