awk到Count Sum和Unique改进命令

时间:2014-09-04 17:47:24

标签: awk

想根据第二列,行项目数,第三列总和和第一列的唯一值进行打印。有大约100个InputTest文件而没有排序.. 我使用低于3的命令来实现所需的输出,想知道最简单的方法......

InputTest * .TXT

abc,xx,5,sss
abc,yy,10,sss
def,xx,15,sss
def,yy,20,sss
abc,xx,5,sss
abc,yy,10,sss
def,xx,15,sss
def,yy,20,sss
ghi,zz,10,sss

步骤1:

cat InputTest*.txt | awk -F, '{key=$2;++a[key];b[key]=b[key]+$3} END {for(i in a) print i","a[i]","b[i]}'

运算#1

xx,4,40
yy,4,60
zz,1,10

步骤#2

awk -F ',' '{print $1,$2}' InputTest*.txt | sort | uniq >Op_UniqTest2.txt

运算#2

abc xx
abc yy
def xx
def yy
ghi zz

步骤#3

awk   '{print $2}' Op_UniqTest2.txt | sort | uniq -c

运算#3

 2 xx
 2 yy
 1 zz

期望的输出:

xx,4,40,2
yy,4,60,2
zz,1,10,1

寻找建议!!!

2 个答案:

答案 0 :(得分:1)

BEGIN { FS = OFS = "," }
{ ++lines[$2]; if (!seen[$2,$1]++) ++diff[$2]; count[$2]+=$3 }
END { for(i in lines) print i, lines[i], count[i], diff[i] }
  • lines跟踪第2列中每个值的出现次数
  • seen会记录第二列和第一列的唯一组合,只要找到唯一组合,就会递增diff[$2]++之后的seen[$2,$1]表示条件仅在第一次找到组合时才为真,因为看到[$ 2,$ 1]的值将增加到1并且!看到[$ 2,$ 1 ]将是假的。
  • count共保留第三列
$ awk -f avn.awk file
xx,4,40,2
yy,4,60,2
zz,1,10,1

答案 1 :(得分:1)

使用awk

$ awk '
BEGIN { FS = OFS = "," }
{ keys[$2]++; sum[$2]+=$3 } !seen[$1,$2]++ { count[$2]++ }
END   { for(key in keys) print key, keys[key], sum[key], count[key] }
' file
xx,4,40,2
yy,4,60,2
zz,1,10,1

将输入和输出字段分隔符设置为,块中的BEGIN。我们使用数组keys来识别和计算键。 sum数组保留每个键的总和。 count允许我们跟踪每个column2值的唯一column1。