如何在文本/ CSV文件中为每个唯一的KEY'列'值获得前N行?

时间:2016-02-25 10:36:28

标签: bash shell parsing csv unix

如果您有一个包含多列的CSV /文本文件,即

domain, user
abc.com.au, Bob
abc.com.au, Marley
abc.com.au, Someone
nexle.dk, Daniel
nexle.dk, Dan
nexle.dk, John
nexle.dk, Doe
google.com, Larry
google.com, Sergey

如何通过第1列(域)获得前2个条目?

2 个答案:

答案 0 :(得分:0)

我在Linux / Mac shell脚本解决方案上寻找年龄(查看awk,curl,sort,uniq等),但似乎不能轻易自己做,所以这是我写的一个应用程序:

https://github.com/danieliversen/MiscStuff/blob/master/scripts/findTopUniques.java

基本上,如果你想获得前X个唯一条目,一旦你使用'sort'或其他任何东西对文件进行排序..它的Java可以在任何平台上运行(只需要用JDK编译 - 不不需要任何第三方图书馆。

答案 1 :(得分:0)

如果您的输入文件(例如domname.csv)已将所有域分组在连续的行上(如您的示例所示),则:

$ tail -n +2 domname.csv | awk -F, 'BEGIN{dom=""; n=1} $1==dom && n<2 {print; n++} $1!=dom {print; dom=$1; n=1}'

制作(来自你的例子):

abc.com.au, Bob
abc.com.au, Marley
nexle.dk, Daniel
nexle.dk, Dan
google.com, Larry
google.com, Sergey

在此解决方案中,tail只是为了摆脱标题(domain, user),而awk命令将分隔逗号上的每一行(-F,) ,然后在第一次看到一个域(第一个字段$1)时打印一行(设置计数n=1dom);或者2)如果它在前一行($1==dom)和n<2中看到了域,则递增n(到2),这样就不会打印出更多匹配的行。

如果域没有在连续的行上分组,即它们可以交错,如:

abc.com.au, Bob
nexle.dk, Daniel
abc.com.au, Marley
nexle.dk, Dan

然后,您仍然可以在sort之后但在tail之前使用awk来抢救情况:

$ tail -n +2 domname.csv | sort | awk -F, ...

希望这有帮助。