如何获取具有特定列值的csv文件的前n行?

时间:2018-08-18 20:06:12

标签: bash awk grep cut

在Kaggle中,我有一个csv文件,如下所示:

ip,app,device,os,channel,click_time,attributed_time,is_attributed
83230,3,1,13,379,2017-11-06 14:32:21,,0
17357,3,1,19,379,2017-11-06 14:33:34,,1
35810,3,1,13,379,2017-11-06 14:34:12,,0
45745,14,1,13,478,2017-11-06 14:34:52,,0
161007,3,1,13,379,2017-11-06 14:35:08,,1
18787,3,1,16,379,2017-11-06 14:36:26,,0
103022,3,1,23,379,2017-11-06 14:37:44,,0
114221,3,1,19,379,2017-11-06 14:37:59,,0

现在,我想获取“ is_attributed”为1的前200行。如何使用“ cut”和其他实用程序来做到这一点?

3 个答案:

答案 0 :(得分:3)

借助awk,您可以一次性进行过滤和行限制:

awk -F, -v limit=200 '$NF == 1 { if (++n > limit) exit; print }' file.csv
  • -F,-分隔符是逗号
  • -v limit=200-初始化要在awk命令中使用的变量
  • $NF == 1-仅在最后一个字段的值为1时才采取行动
  • if (++n > limit) exit-收集所需的行数后立即停止阅读输入内容

在上述解决方案中,我们隐式地跳过了标题行,因为标题不以1结尾。为更稳健,我们可以使其明确:

awk -F, -v limit=200 'NR  == 1 { next }
                      $NF == 1 { if (++n > limit) exit; print }' file.csv

由于一些原因,这是比grep ... | head -n更好的解决方案:

  • 这里没有管道(和额外的叉子)
  • 一旦达到上限,我们就会停止;如果输入文件很大(grep -m也可以这样做),则会产生巨大的差异
  • 很容易将此解决方案扩展到任意字段,而不仅仅是第一个或最后一个
  • 如果定界符是一个多字符或需要由正则表达式进行匹配,则awk会非常轻松地处理它

相关帖子:

答案 1 :(得分:1)

当列不变时,您可以使用简单的正则表达式匹配:

exact

答案 2 :(得分:0)

要获取所有符合条件的行,请通过<items> <item> <link type="boardgamepublisher" id="1001" value="(Web published)"/> <link type="boardgamepublisher" id="1341" value="something else"/> </item> </items> 进行传递。