bash - 了解 AWK 和 CSV 文件
问题描述
如何编写一个 AWK 程序来分析 CSV 文件中的字段列表,计算指定字段中每个不同字符串的数量,并打印出找到的每个字符串的计数?我只用 C 和 Java 编写过代码,所以我对 AWK 的语法完全感到困惑。我理解最简单的概念,但是,AWK 的结构大不相同。随时感谢,谢谢!
BEGIN {
FS = ""
}
{
for(i = 1; i <= NF; i++)
freq[$i]++
PROCINFO ["sorted_in"] = "@val_num_desc" #this got the desired result
}
END {
for {this in freq)
printf "%s\t%d\n", this, freq[this]
}
在包含以下内容的 CSV 文件上:
Field1, Field2, Field3, Field4
A, B, C, D
A, E, F, G
Z, E, C, D
Z, W, C, Q
我能够得到结果:
A 2
B 1
C 3
Q 1
D 1
E 2
F 1
, 12
G 1
W 1
Field1,Field2,Field3,Field4 1
Z 2
这是期望的结果:
A 10
C 7
D 2
E 2
Z 2
B 1
Q 1
Field1 1
Field2 1
F 1
Field3 1
G 1
Field4 1
W 1
我的代码有一个已注释的编辑。
解决方案
修复了您的代码:
$ awk '
BEGIN { # you need BEGIN block for FS
FS = ", *" # your data had ", " and "," seps
} # ... based on your sample output
{
for(i = 1; i <= NF; i++)
freq[$i]++
}
END {
for(this in freq) # fixed a parenthesis
printf "%s\t%d\n", this, freq[this]
}' file
输出(使用 GNU awk。其他 awk 以不同的顺序显示输出):
A 2
B 1
C 3
Q 1
D 2
Field1 1
E 2
Field2 1
F 1
Field3 1
G 1
Field4 1
W 1
Z 2
推荐阅读
- python - Python中的嵌套输入标签多维数组形式
- python - 在 Python 中创建汇总表
- mysql - 为什么 MySQL View 和同一个 View 的底层 SELECT 查询返回不同的结果?
- python - 如何最好地将 numpy 数组列表强制转换为 pandas 数据框列?
- c# - 处理游戏中的人口(统一)
- java - 如何在没有 org.jdesktop.beansbinding 的 Apache Netbeans 中实现绑定
- bash - bash:下面的序列试图做什么?
- angular - 如何使用 Greasemonkey 用我自己的 Angular 单页应用程序替换 web?
- html - 如何用破折号替换有序列表中的句点并仍然保持适当的缩进?
- ssl-certificate - javax.net.ssl.SSLHandshakeException:收到致命警报:google-client-api 的handshake_failure