我有一个带有标题行的.csv文件,如此;
headerA,headerB,headerC
bill,jones,p
mike,smith,f
sally,silly,p
我想过滤掉headerC列中带有f值的所有记录。
我能用sed或awk做到吗?
答案 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选项并相应地改变它。