【发布时间】:2016-12-15 22:32:21
【问题描述】:
我在 HDFS 中有一个 csv 文件,我正在使用 fread() 将其读入 R。数据如下所示:
Date Code Value TransactionID
2016-01-01 769 123 16U11863C2MS0000337625C1
2016-02-01 2MS-US 456 16U11863C2MS0000337626C1
2016-03-01 E9E-US 789 16U11863C2MS0000337627C1
我想使用sed 仅读取代码为“2MS-US”或“769”的行。我没有使用grep,因为它不保留标题。我试过了:
fread("hadoop fs -text /path/to/file.csv | sed -n '1p;/^[0-9]*-[0-9]*-[0-9]* 2MS-US/p; /^[0-9]*-[0-9]*-[0-9]* 769/p'", fill=TRUE)
但这会返回零行。我猜我有错误的正则表达式,但不知道如何解决。
我也尝试过使用awk,但只是用条件过滤没有任何运气:
fread("hadoop fs -text /path/to/file.csv | awk '$2 == 2MS-US'", fill=TRUE)
返回以下错误信息:
fread 中的错误(....) 期望 2 列,但第 5293 行在处理所有列后包含文本。使用 fill=TRUE 重试。
任何关于sed 或awk(如果awk 能够保留标题)的修复建议将不胜感激!
编辑:
感谢@amaurea 以及thread 的帮助,我已经能够通过以下代码实现我的目标:
fread("/usr/bin/hadoop fs -text /path/to/file.csv | awk -F '\"*,\"*' 'FNR==1||$2==\"2MS-US\"||$2==\"769\"'"
如果我错了,请纠正我,但在我看来,当使用awk 处理 csv 文件时,需要-F '\"*,\"*',而文本文件则不然。
【问题讨论】: