【发布时间】:2011-09-20 08:08:12
【问题描述】:
我有一个带有这样标题行的 .csv 文件;
headerA,headerB,headerC
bill,jones,p
mike,smith,f
sally,silly,p
我想过滤掉 headerC 列中的 f 值的所有记录。
我可以用 sed 或 awk 做到这一点吗?
【问题讨论】:
我有一个带有这样标题行的 .csv 文件;
headerA,headerB,headerC
bill,jones,p
mike,smith,f
sally,silly,p
我想过滤掉 headerC 列中的 f 值的所有记录。
我可以用 sed 或 awk 做到这一点吗?
【问题讨论】:
如果标题在第三列名称中不只包含f:
sed '/,f$/d' FILE
可以(如果输入以,f 结尾,则从输入中删除每一行)。
如果有,我会选择:
sed -n -e '1p;/,[^f]$/p' FILE
(默认不打印任何内容(-n),但第一行必须是1p,如果行以f以外的其他字符结尾... 注意:这个如果第 3 列 c 包含多个字符,则不起作用。)
还有一个awk:
awk -F, 'NF == 1 ; NF > 1 && $3 != "f"' FILE
(这总是打印第一行 (NF == 1 为真,然后是默认操作,即print $0,然后下一个条件是检查我们是否超过了第一行,第三个字段不是@987654332 @ 然后默认操作...)
HTH
【讨论】:
/,[^f]$/不匹配,因此将被过滤。
好吧,如果你知道headerC 总是在第三列,那么下面的 sed 命令就可以了:
sed -r '/[^,]+(,[^,]+){1},f/ d' < file.csv > filefiltered.csv
以下 awk 命令也是如此:
awk 'BEGIN {FS=","} {if($3 != "f") print}' file.csv
如果你不知道headerC 总是在一个特定的列中,那就有点棘手了。这行得通吗?
【讨论】:
awk -F, '$3 != "f"' file.csv
有点不清楚,这是你要的吗?
$ 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
【讨论】:
grep 有效,看例子。
grep ",.*,.*f" << EOF
headerA,headerB,headerC
bill,josef,p
mike,smith,f
sally,silly,p
EOF
输出:
mike,smith,f
【讨论】:
不需要 sed 或 awk,这可以通过更简单的命令来完成,例如 cut 和 grep 像这样通过管道连接在一起
cut -d"," -f 3| grep -i f
我假设分隔符是逗号,而 c 列是第三列。如果它没有适当地改变上面的值。我已经使用了带有 i 选项的 grep,以便它忽略大小写。如果您只想匹配小写 f 或大写 f,请删除 i 选项并相应地进行更改。
【讨论】: