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

how to align the decimal values in a ksh script report

我正在尝试对齐 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"," ",," ",) >> outfile
            r[NR] = 
            c[NR] = 
    }
      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 可以拥有或处理文件两次的最大长度,以便在第一遍中计算它。假设你知道最大宽度,替换

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

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

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

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

awk -F, -v outfile="$outfile" -v ts="$ts"  -v tc="$tc" -v sq="'" '
     NR == FNR {
       width = length(sprintf("%" sq ".2f", ));
       if(width > maxwidth) maxwidth = width;
       next
     }
     {
        printf("%14s Code %s%15s%" sq maxwidth ".2f\n"," ",," ",) >> outfile
        r[NR] = 
        c[NR] = 
     }
     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", ));
       if(width > maxwidth) maxwidth = width;
       next
     }

在第一次遍历文件时执行,当 FNR == NR 时,其余在第二次遍历时执行。请注意,trancodestotalsumt.txt 在末尾两次提供给 awk 以使其工作。