awk数组:计数列返回行

时间:2013-11-02 11:22:40

标签: multidimensional-array awk

我已经尝试了几个awk数组但是无法理解它。 有一个包含4个列的文件,awk skript应该为每一行计算第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列打印计数器。例如,第一行在第2列中具有值“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

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

干杯

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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