想根据第二列,行项目数,第三列总和和第一列的唯一值进行打印。有大约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
寻找建议!!!
答案 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。