2012-12-30 27 views
0

我從mysql中的查詢中獲得一些數據,我需要將它轉換爲漂亮的表格。 後來我用awk和printf對齊列,格式號碼等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將此字段作爲十進制數讀取,所以它會顯示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 

我的願望(或類似) :

通過合理的殼+ awk的語法重寫你的腳本
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 
+2

請發送一個輸入,並輸出你將要擁有的例子;而且,試着重新解釋你的問題 - 主要是你的代碼 - 甚至很難縮進 – Rubens

回答

3

讓我們開始,最好能告訴我:

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 
+0

謝謝埃德。我的調試:awk:cmd。 line:5:(FILENAME =/home/jm/mysql/pruebas/pruebatt.txt FNR = 1)fatal:沒有足夠的參數來滿足格式字符串 '%-7s%-30s%'10d%'10d%'10d% '8.2f%'8.2f%'8.2f ' ^用完這一個 –

+0

由於您使用了非默認的FS,split()失敗。我已經更新了腳本。 –

+0

我也從您發佈的預期輸出中看到,您只需要在長度考慮因素中計算非空格,所以我更新了腳本以反映該情況。實際上,我認爲這是錯誤的方法 - 最好是按照你的意願獲取你的數字,然後再用空格填充,但是由於格式化信息隱藏在你的$ A等等中,所以我不能說出它是如何的真的需要編碼。你真的需要將格式化信息放在shell變量中嗎?或者你可以在awk中做到這一點? –