我有一个包含 4 列的CSV 文件:Date
、User
和Email
Comment
我如何过滤列too much, later
中的行Comment
,然后将其读入名为 的新文件中input1.csv
?
以下是我尝试过的,但input1.csv
结果是空白的:
awk -F , '$4 == "too much, later" { print }' input.csv > input1.csv
这是示例输入:
Date,User,Email,Comment
11/22/16,aaaa,[email protected],too much,later
答案1
可以用 来完成awk
,但是很尴尬。 :) 使用真正的 CSV 解析器会更好,例如csvkit:
csvgrep -c Comment -m 'too much, later' file.csv
答案2
假设 CSV 格式正确:
Date,User,Email,Comment
11/22/16,aaaa,[email protected],"too much, later"
这有效,使用csvkit
:
$ csvgrep -c Comment -m 'too much, later' data.csv
Date,User,Email,Comment
11/22/16,aaaa,[email protected],"too much, later"
$ csvgrep -c 4 -m 'too much, later' data.csv
Date,User,Email,Comment
11/22/16,aaaa,[email protected],"too much, later"
或者,使用sed
(因为我们知道它在最后一列):
$ sed -n -e '1p' -e '/too much, later"$/p' data.csv
Date,User,Email,Comment
11/22/16,aaaa,[email protected],"too much, later"
数据如问题所示:
$ sed -n -e '1p' -e '/too much,later$/p' data.csv
Date,User,Email,Comment
11/22/16,aaaa,[email protected],too much,later
答案3
我看到一个简单的问题:字符串too much, later
包含一个,
(逗号)并且您的字段分隔符也是,
,因此 $4 参数将为too much
, $5 将为later
。
您可以将代码更改为:
awk -F , '$4 == "too much" && $5 == "later " { print }' input.csv > input1.csv
请注意,此解决方案仅在最后一个字段完全正确时才有效too much,later
(注意字符串中的结尾空格)。
基于正则表达式的解决方案更加强大:
awk -F , '/,\s*too\s+much,\s*later\s*/{ print }' input.csv > input1.csv
在此解决方案中,字符串中可以包含任意数量的空格字符。
答案4
awk -F"," 'NF>4 {
b=$0; $1=$2=$3=""
if (match($0,/too much, ?later/))
print b
}' OFS="," input.csv > input1.csv