首页 > 解决方案 > 了解 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

我的代码有一个已注释的编辑。

标签: bashcsvawk

解决方案


修复了您的代码:

$ 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

推荐阅读