如何获取具有特定列值的 csv 文件的前 n 行?
How to get the first n rows of a csv file with a specific column value?
在 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" 和其他实用程序来做到这一点?
当列不变时,您可以使用简单的正则表达式匹配:
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 时才采取行动
if (++n > limit) exit
- 一旦我们收集到所需的行数就停止读取输入
我们隐式地跳过了上述解决方案中的 header 行,因为 header 不以 1 结尾。为了更稳健,我们可以将其显式化:
awk -F, -v limit=200 'NR == 1 { next }
$NF == 1 { if (++n > limit) exit; print }' file.csv
这是比 grep ... | head -n
更好的解决方案,原因如下:
- 这里没有管道(和一个额外的分支)
- 我们一到线就停止;如果输入文件非常大(
grep -m
也可以这样做) ,这会产生很大的不同
- 很容易将此解决方案扩展到任意字段,而不仅仅是第一个或最后一个
- 如果分隔符是multi-character一个或者它需要用正则表达式匹配,那么awk处理起来很容易
相关post:
- Using grep vs awk 在 Unix 上 & Linux Stack Exchange
在 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" 和其他实用程序来做到这一点?
当列不变时,您可以使用简单的正则表达式匹配:
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 时才采取行动
if (++n > limit) exit
- 一旦我们收集到所需的行数就停止读取输入
我们隐式地跳过了上述解决方案中的 header 行,因为 header 不以 1 结尾。为了更稳健,我们可以将其显式化:
awk -F, -v limit=200 'NR == 1 { next }
$NF == 1 { if (++n > limit) exit; print }' file.csv
这是比 grep ... | head -n
更好的解决方案,原因如下:
- 这里没有管道(和一个额外的分支)
- 我们一到线就停止;如果输入文件非常大(
grep -m
也可以这样做) ,这会产生很大的不同
- 很容易将此解决方案扩展到任意字段,而不仅仅是第一个或最后一个
- 如果分隔符是multi-character一个或者它需要用正则表达式匹配,那么awk处理起来很容易
相关post:
- Using grep vs awk 在 Unix 上 & Linux Stack Exchange