web-dev-qa-db-ja.com

Awk printfコマンドで出力を正しくフォーマットする方法は?

次のファイルがあります。

echo filename
    dfT08r352|30.5|2010/06/01|2016/08/29|2281|6.24503764544832|74.9404517453799|
    zm00dr121|37|2008/03/05|2011/09/12|1285.95833333333|3.52076203513575|42.249144421629|
    ccvd00121|41.6|2008/03/05|2012/03/05|1461|4|48|
    sddf00121|39.6|2008/03/05|2012/09/10|1649.95833333333|4.51733972165184|54.208076659822|
    fttt00121|41|2008/03/05|2013/09/16|2020.95833333333|5.53308236367785|66.3969883641342|
    ghhyy0121|42.2|2008/03/05|2014/03/18|2203.95833333333|6.03410905772302|72.4093086926762|

Awk printfを使用してこのファイルをフォーマットし、次の目的のフォーマットにしようとしています。

  1. フィールドの順序を同じにする(左->右)
  2. カンマがあります "、" FS
  3. l ast 3つのフィールド($ 5、$ 6、$ 7)の場合のみ、すべての数値が4桁になります(0123.12や1234.10のように、ポイントの後に2桁しか先行しない場合は4桁になります)。

私は次のawkコマンドを書きました

awk -F"|" '{print $1","$2","$3","$4}{format = "%04.2f,%04.2f,%04.2f,"}{printf format, $5,$6,$7}' filename

ただし、以下の出力には次の問題があります。

  1. 順番が悪い(左->右)

  2. 先頭にゼロがありません

    dfT08r352,30.5,2010/06/01,2016/08/29
    2281.00,6.25,74.94,zm00dr121,37,2008/03/05,2011/09/12
    1285.96,3.52,42.25,ccvd00121,41.6,2008/03/05,2012/03/05
    1461.00,4.00,48.00,sddf00121,39.6,2008/03/05,2012/09/10
    1649.96,4.52,54.21,fttt00121,41,2008/03/05,2013/09/16
    2020.96,5.53,66.40,ghhyy0121,42.2,2008/03/05,2014/03/18
    

誰かが私の間違いとそれを修正する方法を教えてもらえますか?

3
Daniel

それを行う1つの方法:

awk -F \| -v OFS=, '{ NF--; for(i = NF-2; i <= NF; i++) $i = sprintf("%07.2f", $i) } 1' filename
2
Satō Katsura