【问题标题】:awk array: count column return lineawk 数组:计数列返回行
【发布时间】:2013-11-13 12:22:24
【问题描述】:

我已经尝试了几个 awk 数组,但就是无法理解它。 拥有一个包含 4 列的文件,awk 脚本应该计算每行第 2 列中的值出现的次数。

输入文件

A1^ABC^173^2012
A2^BDK^153^2013
A3^AFD^223^2012
B1^ABC^083^1999
B2^KLX^033^2012
B3^ABC^593^2003 
B4^KLX^323^2001

因此,我想在每行末尾打印第 2 列中的值的计数器。例如,第一行在 column2 中具有值“ABC”。 “ABC”在整个文件中出现 3 次,并打印在行尾。

输出文件

A1^ABC^173^2012^3
A2^BDK^153^2013^1
A3^AFD^223^2012^1
B1^ABC^083^1999^3
B2^KLX^033^2012^2
B3^ABC^593^2003^3
B4^KLX^323^2001^2

希望有人知道如何解决它。

干杯

【问题讨论】:

    标签: multidimensional-array awk


    【解决方案1】:

    这是使用awk的一种方式:

    awk 'BEGIN { FS=OFS="^" } FNR==NR { a[$2]++; next } { print $0, a[$2] }' file.txt{,}
    

    结果:

    A1^ABC^173^2012^3
    A2^BDK^153^2013^1
    A3^AFD^223^2012^1
    B1^ABC^083^1999^3
    B2^KLX^033^2012^2
    B3^ABC^593^2003^3
    B4^KLX^323^2001^2
    

    【讨论】:

    【解决方案2】:

    缓冲方法:

    awk -F'^' -v OFS='^' '{a[NR]=$0;c[$2]++}
        END{for(i=1;i<=NR;i++){split(a[i],b);print a[i],c[b[2]]}}' file
    

    输出:

    A1^ABC^173^2012^3
    A2^BDK^153^2013^1
    A3^AFD^223^2012^1
    B1^ABC^083^1999^3
    B2^KLX^033^2012^2
    B3^ABC^593^2003^3
    B4^KLX^323^2001^2
    

    要将输出存储在新文件中,请使用重定向运算符:

    awk -F'^' -v OFS='^' '{a[NR]=$0;c[$2]++}
        END{for(i=1;i<=NR;i++){split(a[i],b);print a[i],c[b[2]]}}' file > outfile
    

    【讨论】:

    • +1 非常好的答案,相信我,我在做我的工作时没有看到这个。
    • 工作正常,非常感谢。但我实际上没有得到拆分和后续打印部分。 “b”在做什么?
    猜你喜欢
    • 1970-01-01
    • 2021-02-18
    • 2017-10-25
    • 2011-07-31
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多