0

我已经尝试了几个 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

希望任何人都知道如何解决它。

干杯

4

2 回答 2

4

这是一种使用方法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
于 2013-11-02T11:35:31.727 回答
3

缓冲方法:

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
于 2013-11-02T11:40:32.607 回答