2013-11-02 38 views
0

我已经尝试了几个awk数组,但是只能绕过它。 拥有4个colums的文件awk skript应该为每行计算第2列中值的出现次数。awk数组:count列返回行

输入文件

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列的值设置计数器。例如,第一行在第二栏中的值为“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

下面是使用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 
+0

什么是'{,}'怎么办? – Jotne

+2

@Jotne接受两次输入文件,尝试'echo file {,}'。 –

+0

呵呵,对我来说一个新的,谢谢:) - '{,,,}'重复三遍 – Jotne

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 
+0

+1非常好的答案,相信我我在开矿工作时没有看到这个。 – anubhava

+0

工作正常,非常感谢。但我实际上没有得到拆分和下面的打印部分。 'b'在做什么? – eh2deni