根据包含嵌入逗号的列值选择 CSV 文件中的行

根据包含嵌入逗号的列值选择 CSV 文件中的行

我有一个包含 4 列的CSV 文件:DateUserEmailComment

我如何过滤列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

相关内容