Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何获取具有特定列值的csv文件的前n行?_Bash_Awk_Grep_Cut - Fatal编程技术网

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

Bash 如何获取具有特定列值的csv文件的前n行?,bash,awk,grep,cut,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 1

在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”和其他实用程序实现这一点?

当列不变时,您可以使用简单的regexp匹配:

grep -E  '(^ip,|,1$)' »file.csv« | head -n 201

要获得符合条件的所有行,通过
grep,1$| head-n 200

awk
可以一次完成筛选和行限制:

awk -F, -v limit=200 '$NF == 1 { if (++n > limit) exit; print }' file.csv
  • -F,
    -分隔符是逗号
  • -v limit=200
    -初始化要在awk命令中使用的变量
  • $NF==1
    -仅当最后一个字段的值为1时才执行操作
  • 如果(++n>限制)退出
    -在收集到所需行数后立即停止读取输入
在上述解决方案中,我们隐式跳过了标题行,因为标题不是以1结尾的。为了更加稳健,我们可以将其明确化:

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


这是一个比grep更好的解决方案head-n原因如下:

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

相关职位:

  • Unix与Linux堆栈交换

使用GNU grep,您可以执行
grep-m201-E'(^ip,|,1$)”
提问时,请添加您自己尝试解决的问题。
grep…|head-n
在达到管线限制时也会停止,因为head会关闭管道,因此在达到限制时会向grep返回终止信号(请参阅)。