csv文件过滤

时间:2011-06-22 12:07:55

标签: sed awk

我有一个带有标题行的.csv文件,如此;

headerA,headerB,headerC
bill,jones,p
mike,smith,f
sally,silly,p

我想过滤掉headerC列中带有f值的所有记录。

我能用sed或awk做到吗?

5 个答案:

答案 0 :(得分:7)

如果标题在第三列名称中仅包含f

sed '/,f$/d' FILE

将执行(如果以,f结尾,则从输入中删除每一行)。

如果有,我会选择:

sed -n -e '1p;/,[^f]$/p' FILE

(默认情况下不打印任何内容(-n),但第一行必须1p,如果这些行以f之外的其他字符结尾... 注意:如果第3个columnc包含多个char,则无法使用。)

awk一个:

awk -F, 'NF == 1 ; NF > 1 && $3 != "f"' FILE

(这总是打印第一行(NF == 1为真,然后是默认操作,即print $0,然后下一个条件是检查我们是否超过了第1行和第3行不是f然后是默认操作...)

HTH

答案 1 :(得分:2)

好吧,如果你知道headerC总是在第三列,那么下面的sed命令就可以了:

sed -r '/[^,]+(,[^,]+){1},f/ d' < file.csv > filefiltered.csv

以下awk命令也是如此:

awk 'BEGIN {FS=","} {if($3 != "f") print}' file.csv

如果您不知道headerC总是在特定列中,则会变得有点棘手。这有用吗?

答案 2 :(得分:1)

有点不清楚,这是你要求的吗?

$ awk -F, '{ if($3 == "f")print}' input
mike,smith,f

使用标题并使用column

进行格式化
$ awk -F, '{ if (NR == 1)print}{if($3 == "f")print}' input | column -t -s,
headerA  headerB  headerC
mike     smith    f

答案 3 :(得分:1)

grep工作,看看例子。

grep ",.*,.*f" << EOF
headerA,headerB,headerC
bill,josef,p
mike,smith,f
sally,silly,p
EOF

输出:

mike,smith,f

答案 4 :(得分:-2)

不需要sed或awk,这可以通过更简单的命令来完成,例如像这样使用cut和grep管道连接

cut -d"," -f 3| grep -i f

我假设分隔符是昏迷而C列是第三个。如果它没有适当地改变上面的值。我已经使用grep和i选项,以便忽略大小写。如果你只想匹配lowercse f或upppercase f,那么删除i选项并相应地改变它。