需要在solaris中将数据显示为表格视图

时间:2015-02-02 05:54:05

标签: awk solaris

我有以下数据名为atp.csv file

Date_Time,M_ID,N_ID,Status,Desc,AMount,Type
2015-01-05 00:00:00 076,1941321748,BD9010423590206,200,Transaction Successful,2000,PRETOP
2015-01-05 00:00:00 077,1941323504,BD9010423590207,351,Transaction Successful,5000,PRETOP
2015-01-05 00:00:00 078,1941321743,BD9010423590205,200,Transaction Successful,1500,PRETOP
2015-01-05 00:00:00 391,1941323498,BD9010500000003,200,Transaction Successful,1000,PRETOP

我使用下面的命令来计算结果..

cat atp.csv|awk -F',' '{print $4}'|sort|uniq -c

输出低于。

3 200
1 351

但我想在表格视图中输出此输出..希望将此数据显示为表格视图。有可能??

1 个答案:

答案 0 :(得分:0)

是的,有可能,这样一个简单的例子:(见答案末尾的注释)

echo "3 200\n1 351"|awk -v t=7 
'NR==1{for(i=1;i<=t*NF+NF+1;i++)printf "-";print ""}
{
    for(i=1;i<=NF;i++){
        if(i==1)printf "|";
            fmt="%"t"s|"
            printf  fmt, $i
        }
        print ""
    }
    END{for(i=1;i<=t*NF+NF+1;i++)printf "-";print ""}' 

此输出

-----------------
|      3|    200|
|      1|    351|
-----------------

如果您更改-v t=20,则会输出:

-------------------------------------------
|                   3|                 200|
|                   1|                 351|
-------------------------------------------

如果你想在每一行之后加一行,也就是每个单元格的边框:

kent$  echo "3 200\n1 351"|awk -v t=20 
'NR==1{for(i=1;i<=t*NF+NF+1;i++)printf "-";print ""}
{
        for(i=1;i<=NF;i++){
                if(i==1)printf "|";
                        fmt="%"t"s|"
                        printf  fmt, $i
                }
                print ""
                for(i=1;i<=t*NF+NF+1;i++)printf "-"
                print ""
        }'
-------------------------------------------
|                   3|                 200|
-------------------------------------------
|                   1|                 351|
-------------------------------------------

注意

  • 没有“autowrap”发生
  • 如果您的输出/文件具有空字段或每行中具有不同数量的字段,则上述代码可能会失败。这部分没有实施。
  • -v t=**定义每个单元格的宽度,可以做得更好*(见下一项)
  • 您必须提供足够的 t值才能使用此脚本。这可以做得更好,(我没有这样做)。您可以处理文件/输出两次,首先查找最长的字段,以便我们可以动态获取t
  • 进一步优化:现在每列的宽度相同(t),您可以在第一轮获取每列中最长的字段,这样可以使列宽不同。