在solaris中如何使用awk命令绘制表

时间:2015-02-03 06:49:23

标签: 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

我使用下面的命令

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

out put是:

3 200
1 351

但我想在下面

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

3 个答案:

答案 0 :(得分:3)

您可以再次使用awk对其进行制表,例如(添加NR>1过滤器以删除标题行):

pax$ awk -F',' 'NR>1{print $4}' atp.csv | sort | uniq -c | awk '
    BEGIN { div = "+-------+-------+"; print div }
    { printf("| %5d | %5d |\n",$1,$2); print div }'

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

如果您使用字符串而不是数字,那么您可以在格式字符串中使用%7s来表示右对​​齐,或%-7s表示左对齐:

pax$ echo 'pax diablo
bob smith
loretta jones' | awk '
    BEGIN { div = "+-----------+-----------+"; print div }
    { printf ("| %9s | %-9s |\n", $1, $2);     print div}'
+-----------+-----------+
|       pax | diablo    |
+-----------+-----------+
|       bob | smith     |
+-----------+-----------+
|   loretta | jones     |
+-----------+-----------+

答案 1 :(得分:0)

使用GNU awk进行内置排序(PROCINFO["sorted_in"] = "@val_num_desc"):

$ cat tst.awk
BEGIN {
    FS = ","
    PROCINFO["sorted_in"] = "@val_num_desc"
}
NR>1 { cnt[$4]++ }
END {
    for (val in cnt) {
        width_v = length(val)
        width_c = length(cnt[val])
        max_wv = (max_wv > width_v ? max_wv : width_v)
        max_wc = (max_wc > width_c ? max_wc : width_c)
    }

    sep = sprintf("%*s", max_wv + max_wc + 7, "")
    gsub(/ /,"-",sep)
    print sep
    for (val in cnt) {
        printf "| %*s | %*s |\n", max_wc, cnt[val], max_wv, val
        print sep
    }
}
$ awk -f tst.awk file
-----------
| 3 | 200 |
-----------
| 1 | 351 |
-----------

请注意,上面将根据计算出的每个单元格内容的最大宽度来调整表格的单元格,您无需指定它。

在你说&#34之前;但是我在Solaris上并且没有傻瓜" - 得到它。它具有大量非常有用的功能,它可以节省您使用Solaris附带的任何awks的大量时间。

答案 2 :(得分:0)

您可能需要查看ftable它是一个单片perl脚本,除了perl核心之外没有任何外部依赖。

只需下载使其可执行并运行(您可能需要根据您的perl安装位置更改您的shee bang)

在行动中:

$ echo $'3 200\n1 351' | ftable -F '\s'
+---+-----+
| 3 | 200 |
+---+-----+
| 1 | 351 |
+---+-----+