![如何获取同一行的总行数和唯一计数](https://linux22.com/image/93086/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E5%90%8C%E4%B8%80%E8%A1%8C%E7%9A%84%E6%80%BB%E8%A1%8C%E6%95%B0%E5%92%8C%E5%94%AF%E4%B8%80%E8%AE%A1%E6%95%B0.png)
我有一个包含以下行的文件(test.csv):
2016-08-23 00:00:00,270113184103681474
2016-08-23 00:00:00,270113184101689340
2016-08-23 00:00:00,270113184103681474
2016-08-23 00:00:00,270113184101689340
2016-08-23 01:00:00,270113184103681474
2016-08-23 01:00:00,270113184101689340
我想获取第一列中每一列的总行数和第二列的唯一出现次数。上述几行的期望输出是:
2016-08-23 00:00:00, 4, 2
2016-08-23 01:00:00, 2, 2
有一个简单的 grep/awk 解决方案吗?
答案1
天真的解决方案只是计算每次出现的次数并跟踪以查看我们以前是否见过它。
所以:
awk -F, '{ t[$1]++; seen[$0]++; if (seen[$0] == 1) { u[$1]++ } }
END { for (a in t) { print a "," t[a] "," u[a] } }'
第一行将跟踪该日期在 中出现的总次数t
。它将跟踪我们在 中看到每一行的次数seen
,如果这是我们第一次看到它,那么我们就知道它是唯一的并将其计入 中u
。
第二行将迭代结果并将其打印出来。
答案2
如果您可以求助于 GNUawk
awk -F, '{a[$1]++; b[$1][$2]};
END{for (k in a) printf "%s,%d,%d\n", k, a[k], length(b[k])}' test.csv