【问题标题】:Parsing all CSV files in a directory, line by line逐行解析目录中的所有CSV文件
【发布时间】:2014-05-13 12:49:24
【问题描述】:

我在一个目录中有许多 CSV 文件,它们都具有相同的结构。 话虽如此,我想解析这些行并计算预定义值数组a = [A, B, C, D] 中第 5 列有多少行。

我对 shell 脚本非常缺乏经验,所以 awk 是这样做的方法,还是我应该使用 python 脚本?

【问题讨论】:

    标签: shell unix csv awk


    【解决方案1】:

    使用这个 awk 一个班轮:

    awk '$5 ~ /^(A|B|C|D)$/' *.csv
    

    它遍历当前目录中所有 .csv 文件的所有行,并检查第 5 列 ($5) 是否匹配 (~) 模式 ^(A|B|C|D)$。如果该行与模式匹配,则 awk 将打印整行。我们没有指定动作,但打印整行是 awk 的默认动作。

    图案:

    ^ 匹配字符串的开头,$ 匹配字符串的结尾。因此模式从头到尾匹配。 (A|B|C|D) 表示可能值的选择,就像其他编程语言中的逻辑 OR 操作一样。我在您的问题中使用了单个字符 A,B,C,D,但您可以随意使用 (foo|bar|hello|world) 之类的字符。

    【讨论】:

    • 很好的答案,完全符合我的需求!谢谢!
    • 计算行数可以在awk中完成,我更喜欢追加| wc -l
    【解决方案2】:

    另一个当前发布的答案进行了 RE 比较,这几乎肯定不是您真正想要的(如果您想要的值之一是 .*,请尝试)。

    这是一个字符串比较:

    awk '
    BEGIN{ split("A B C D",tmp); for (i in tmp) a[tmp[i]] }
    $5 in a { cnt++ }
    END { print cnt+0 }
    ' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 2020-04-09
      • 2011-12-05
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      相关资源
      最近更新 更多