我已经尝试了几个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
希望有人知道如何解决它。
干杯
答案 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