【发布时间】:2014-05-13 12:49:24
【问题描述】:
我在一个目录中有许多 CSV 文件,它们都具有相同的结构。
话虽如此,我想解析这些行并计算预定义值数组a = [A, B, C, D] 中第 5 列有多少行。
我对 shell 脚本非常缺乏经验,所以 awk 是这样做的方法,还是我应该使用 python 脚本?
【问题讨论】:
我在一个目录中有许多 CSV 文件,它们都具有相同的结构。
话虽如此,我想解析这些行并计算预定义值数组a = [A, B, C, D] 中第 5 列有多少行。
我对 shell 脚本非常缺乏经验,所以 awk 是这样做的方法,还是我应该使用 python 脚本?
【问题讨论】:
使用这个 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) 之类的字符。
【讨论】:
| wc -l。
另一个当前发布的答案进行了 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
【讨论】: