0

mysqlのクエリから、見栄えの良いテーブルに変換する必要のあるデータを取得します。次に、awkとprintfを使用して、列の整列、数値のフォーマットなどを行います。

cat /home/jm/mysql/pruebas/pruebat.txt | awk 'BEGIN { FS = ";" } ; {printf "%-'$A's %-'$B's %'\'''$C'd %'\'''$D'd %'\'''$E'd %'\'''$F'.2f %'\'''$F'.2f %'\'''$F'.2f\n", $1, $2, $3, $4, $5, $6, $7, $8 }' >> /home/jm/mysql/pruebas/prn.tx

私の問題は、一部のフィールドが長すぎる場合に発生します(たとえば、年ごとの変動率は-12.345,67%です)。その場合は######だけを表示したいと思います。クエリでcase/when / then / endを使用すると、long値を文字列######で置き換えることができますが、awk + ​​printfはこのフィールドを10進数として読み取るため、代わりに0.00%を表示します。希望 ######。「この変数が長すぎる場合は、######を出力する」と書く方法はありますか?ありがとう、

jm

編集:

私のソースファイル(ヘッダーを忘れてください):

S_V;NO INVENTARIABLES;-41.7000;-67.5200;-25.8200;61.91846523;100.00000000;100.00000000
S_A;ARTICULOS PROMOCIONES;54.4400;631.3200;576.8800;1059.66201323;-1412.30712711;-19.76018501
S_B;PRODUCTOS TECNICOS;975.6000;1951.2000;975.6000;100.00000000;36.01476015;34.61254613
S_S;MATERIAL ELECTRICO;2237.6600;5103.2500;2865.5900;128.06190395;40.21030898;43.42859942

私の出力:

fam     nombre                               2011       2012        var        %   %mgn11   %mgn12
--------------------------------------------------------------------------------------------------
S_V     NO INVENTARIABLES                     -41        -67        -25    61.92   100.00   100.00
S_A     ARTICULOS PROMOCIONES                  54        631        576 1,059.66 -1,412.31   -19.76
S_B     PRODUCTOS TECNICOS                    975      1,951        975   100.00    36.01    34.61
S_S     MATERIAL ELECTRICO                  2,237      5,103      2,865   128.06    40.21    43.43

私の願い(または同様のもの):

fam     nombre                               2011       2012        var        %   %mgn11   %mgn12
--------------------------------------------------------------------------------------------------
S_V     NO INVENTARIABLES                     -41        -67        -25    61.92   100.00   100.00
S_A     ARTICULOS PROMOCIONES                  54        631        576   ######   ######   -19.76
S_B     PRODUCTOS TECNICOS                    975      1,951        975   100.00    36.01    34.61
S_S     MATERIAL ELECTRICO                  2,237      5,103      2,865   128.06    40.21    43.43
4

1 に答える 1

3

スクリプトを妥当なshell+awk構文で書き直すことから始めましょう。私が知る限り、次のようになります。

awk -F\; -v fmt="%-${A}s %-${B}s %'${C}d %'${D}d %'${E}d %'${F}.2f %'${F}.2f %'${F}.2f\n" '
{ printf fmt, $1, $2, $3, $4, $5, $6, $7, $8 }
' /home/jm/mysql/pruebas/pruebat.txt >> /home/jm/mysql/pruebas/prn.tx

さて、あなたが抱えている問題は、実際には文字列を印刷したいのに、フォーマット文字列が数値を印刷するように具体的に言っていることです。したがって、sprintfを使用して数値を作成し、結果に満足できない場合は、に変更します。出力用の文字列。このようなもの(テストされていない):

awk -F\; -v fmt="%-${A}s %-${B}s %'${C}d %'${D}d %'${E}d %'${F}.2f %'${F}.2f %'${F}.2f\n" '
BEGIN{ split(fmt,fmtA,/ /) }
{
    for (i=1;i<=NF;i++) {
       $i = sprintf(fmtA[i],$i)
       if (gsub(/[^[:space:]]/,"&",$i) > 6) {
           $i = "######"
       }
    }
    print
}
' /home/jm/mysql/pruebas/pruebat.txt >> /home/jm/mysql/pruebas/prn.tx
于 2012-12-31T08:19:13.680 に答える