awk计数总和和唯一改进命令

awk计数总和和唯一改进命令,awk,Awk,希望根据第二列、行项目计数、第三列总和和第一列的唯一值进行打印。有大约100个输入测试文件且未排序。。 我用下面3个命令来实现所需的输出,想知道最简单的方法 输入测试*.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步: 作品#1 第2步 作品2 第三步 作品3 期望输出: xx,4

希望根据第二列、行项目计数、第三列总和和第一列的唯一值进行打印。有大约100个输入测试文件且未排序。。 我用下面3个命令来实现所需的输出,想知道最简单的方法

输入测试*.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步:

作品#1

第2步

作品2

第三步

作品3

期望输出:

xx,4,40,2
yy,4,60,2
zz,1,10,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] }
  • 跟踪第2列中每个值的出现次数
  • seen
    记录第二列和第一列的唯一组合,只要找到唯一组合,就会递增
    diff[$2]
    seen[$2,$1]
    之后的
    ++
    意味着该条件只有在第一次找到组合时才为真,因为seen[$2,$1]的值将增加到1和!所见[$2,$1]将为假
  • count
    保存第三列的总数

使用
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
开始
块中将输入和输出字段分隔符设置为
。我们使用数组
来识别和计数键<代码>总和数组保留每个键的总和
count
允许我们跟踪每列2值的唯一列1

abc xx
abc yy
def xx
def yy
ghi zz
awk   '{print $2}' Op_UniqTest2.txt | sort | uniq -c
 2 xx
 2 yy
 1 zz
xx,4,40,2
yy,4,60,2
zz,1,10,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] }
$ awk -f avn.awk file
xx,4,40,2
yy,4,60,2
zz,1,10,1
$ 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