デジタルフォーマット変換とファイル比較

デジタルフォーマット変換とファイル比較

174のフィールドを持つファイルがあります。最初の4つのフィールドは次のとおりです。

1|2.3|2.3|34
1|0|0|34
1|0.0|0.0|34
1|11|11|34
1|.3|.3|34
1|-0.00|-0.00|34
1|1.67|1.67|34

これを次のように変換する必要があります。

1|2.30|2.30|34
1|0.00|0.00|34
1|0.00|0.00|34
1|11.00|11.00|34
1|0.30|0.30|34
1|0.00|0.00|34
1|1.67|1.67|34

以下を使用しましたが、最後の値は1|1.70|1.70|34

awk 'BEGIN {OFS=FS="|"} {$2=$2+0.00;$3=$3+0.00; print $0 }' file1 > temp1
awk 'BEGIN {OFS=FS="|"} {$2=sprintf("%.2f",$2);$3=sprintf("%.2f",$3);print $0}' temp1 > temp2

答え1

GNU Coreutilsを使用するnumfmtユーティリティ:

numfmt --delimiter='|' --field=2-3 --format='%.2f' < file
1|2.30|2.30|34
1|0.00|0.00|34
1|0.00|0.00|34
1|11.00|11.00|34
1|0.31|0.31|34
1|0.00|0.00|34
1|1.67|1.67|34

--field=2-3要件に応じてフィールドの範囲を調整してください。

答え2

2番目awkの構成はほぼ完璧です。この試み

awk -F'|' 'BEGIN {OFS = FS} {$2 = sprintf("%0.2f", $2+0); $3 = sprintf("%0.2f", $3+0); print $0}'
1|2.30|2.30|34
1|0.00|0.00|34
1|0.00|0.00|34
1|11.00|11.00|34
1|0.30|0.30|34
1|0.00|0.00|34
1|1.67|1.67|34

関連情報