【问题标题】:csv file filteringcsv文件过滤
【发布时间】:2011-09-20 08:08:12
【问题描述】:

我有一个带有这样标题行的 .csv 文件;

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

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

我可以用 sed 或 awk 做到这一点吗?

【问题讨论】:

  • 请注意,CSV 可能包含嵌入的换行符,因此任何纯基于行的解决方案都可能对某些输入做错事。此外,引用的值可能会给问题带来很多天真的方法。
  • @Joey,对。通常的建议是使用带有专用 CSV 库的语言,例如 Perl

标签: sed awk


【解决方案1】:

如果标题在第三列名称中不只包含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

【讨论】:

  • 如果第三列包含 >1 个字符,您的第二个 sed 解决方案将中断。最好坚持使用第一个 sed 或 awk,因为它更精确地实现了要求(如果 "f" 则删除行)
  • 根据“规范”:“我想过滤掉headerC列中f值的任何记录。”所以这是正确的 IMO。
  • 如果第三列包含“ab”,则与/,[^f]$/不匹配,因此将被过滤。
  • 你是对的@glennjackman 如果第 3 列超过 1 个字符,它将不会被打印,更新 desc。
【解决方案2】:

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

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

以下 awk 命令也是如此:

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

如果你不知道headerC 总是在一个特定的列中,那就有点棘手了。这行得通吗?

【讨论】:

  • awk命令可以简化:awk -F, '$3 != "f"' file.csv
  • @glenn 确实可以。但是我从不费心去查找 -F 是否是 gnu 扩展,所以我选择了最安全的。我会认为这意味着它不是:)
【解决方案3】:

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

$ 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

【讨论】:

    【解决方案4】:

    grep 有效,看例子。

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

    输出:

    mike,smith,f
    

    【讨论】:

    • 漂亮,干净,快速(ps。不需要最后的.*)
    【解决方案5】:

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

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

    我假设分隔符是逗号,而 c 列是第三列。如果它没有适当地改变上面的值。我已经使用了带有 i 选项的 grep,以便它忽略大小写。如果您只想匹配小写 f 或大写 f,请删除 i 选项并相应地进行更改。

    【讨论】:

    • 这只会输出第三个字段的值,而不是整行。
    猜你喜欢
    • 2018-07-16
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多