如何在ksh脚本报告中对齐十进制值

时间:2015-02-24 17:15:26

标签: shell awk sh

我试图在awk中调整值...但仍面临一些对齐问题..请你帮忙。

我的格式低于格式。,

                Code 0011               0.00
                Code 0012               0.00
                Code   17               1,234.23
                Code   37               123,456.12
                Code   41               2,345.12
           Total Amount                 8.41
          0011 Record Count              0
         0012 Record Count              0
           17 Record Count              2
           37 Record Count              1
           41 Record Count              2
        Total Record Count              1

但我期待如下。,所有小数都需要正确对齐..

                Code 0011                    0.00
                Code 0012                    0.00
                Code   17                1,234.23
                Code   37              123,456.12
                Code   41                2,345.12
           Total Amount                      8.41
          0011 Record Count             0
         0012 Record Count              0
           17 Record Count              2
           37 Record Count              1
           41 Record Count              2
        Total Record Count              1

记录计数也需要与前一行匹配。

            Code   37                    123,456.12
            Code   41                      2,345.12
           Total Amount                        0.00
         0319 Record Count                        0
         0329 Record Count                       11                    
         0339 Record Count                      321 

这是我试过的代码。

awk -F, -v outfile="$outfile" -v ts="$ts"  -v tc="$tc" -v sq="'" '
     {
            printf("%14s Code %s%15s%" sq ".2f\n"," ",$1," ",$2) >> outfile
            r[NR] = $1
            c[NR] = $3
    }
      END {printf("%14s Total Amount                 %" sq ".2f\n "," ",ts) >> outfile
              for(i = 1; i <= NR; i++) printf("%12s %s Record Count %11s  %s\n"," ",r[i]," ",c[i]) >> outfile
     }' FS=, OFS=, trancodestotalsumt.txt

1 个答案:

答案 0 :(得分:0)

您需要知道i trancodestotalsumt.txt可以拥有的数字的最大长度,或者在第一遍中计算两次以处理该文件。假设您知道最大宽度,请替换

printf("%14s Code %s%15s%" sq ".2f\n"," ",$1," ",$2) >> outfile

#                              vv--- here
printf("%14s Code %s%15s%" sq "10.2f\n"," ",$1," ",$2) >> outfile

将令牌的宽度扩展为n个字符(在本例中为10)。

要记住第一遍的长度,请记住我没有测试数据,请使用

awk -F, -v outfile="$outfile" -v ts="$ts"  -v tc="$tc" -v sq="'" '
     NR == FNR {
       width = length(sprintf("%" sq ".2f", $2));
       if(width > maxwidth) maxwidth = width;
       next
     }
     {
        printf("%14s Code %s%15s%" sq maxwidth ".2f\n"," ",$1," ",$2) >> outfile
        r[NR] = $1
        c[NR] = $3
     }
     END {
         printf("%14s Total Amount                 %" sq ".2f\n "," ",ts) >> outfile
         for(i = 1; i <= NR; i++) printf("%12s %s Record Count %11s  %s\n"," ",r[i]," ",c[i]) >> outfile
     }' FS=, OFS=, trancodestotalsumt.txt trancodestotalsumt.txt

在开头插入的块,

     NR == FNR {
       width = length(sprintf("%" sq ".2f", $2));
       if(width > maxwidth) maxwidth = width;
       next
     }

在第一次传递文件时执行,当FNR == NR时,其余时间在第二次传递期间执行。请注意,trancodestotalsumt.txt最后会给awk两次以使其工作。

相关问题