显示引用特定条件

时间:2017-04-28 00:25:21

标签: sorting sum ksh aix uniq

我的输入如下:

输入:

FILE1    3   5   
FILE2    5   9   
FILE3    4   6   
FILE1    3   5   
FILE1    4   6   
FILE1    3   5   
FILE2    4   6   
FILE3    3   5   
FILE1    8   3   
FILE5    3   5   

所需的输出应如下:

输出:

Name(count)    COLUMN1     COLUMN2   
FILE1(5)       21          24
FILE2(2)       9           15
FILE3(2)       7           11
FILE5(1)       3           5

输出所需的解释:

  • 计算输入中第1列中每个名称的每次出现次数,然后在输出中使用(COUNT)打印名称

  • 获取每个名称输入的第1列的总和,并在输出通知中显示其名称的总和。

  • 第3列应该是上面的总和以及第2列。

更多解释:

  • 输出显示FILE1,计数为5,因为FILE1在输入中重复5次。

  • 计数5的FILE1的值均为21和24

  • 21来自输入

  • 中任何FILE1第2列的总和
  • 24来自输入

  • 中任何FILE1第3列的总和

我尝试使用uniq和for / while进行多次排序,但无法获得所需的输出。

  • 我不需要使用许多临时文件来获取所需内容,我需要简单的在线命令

1 个答案:

答案 0 :(得分:0)

使用awk,您只需解析一次所有行:

awk '{col1[$1]+=$2; col2[$1]+=$3; names[$1]+=1} 
     END { for (name in names) 
            { 
              printf ("%s(%s) %s %s\n", name, names[name], col1[name], col2[name]);  
            }
         }' inputfile

EDIT
说明:
awk逐行处理输入。从每一行开始使用名称$1 汇总是使用col1col2完成的。任何新条目都将以0开头,因此我只需在当前行中添加该值即可。第一列计为+=1,其他列相加 我本来可以补充一下:

printf ("Processing %s, col1 subtotal=%s, col2 subtotal=%s\n",
        $1, col1[$1], col2[$1]);  

当输入文件出现意外情况时,这会很有用 在END块中,我查看存储的所有名称,并使用它们显示相应的列总数。