【问题标题】:awk to Count Sum and Unique improve commandawk to Count Sum 和 Unique 改进命令
【发布时间】:2014-09-05 04:12:00
【问题描述】:

希望根据第 2 列、行项目数、第 3 列总和和第一列的唯一值进行打印。大约有 100 个 InputTest 文件且未排序.. 我正在使用以下 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:

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

寻求建议!!!

【问题讨论】:

    标签: awk


    【解决方案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] 后面的 ++ 表示条件只会在第一次找到组合时为真,因为 seen[$2,$1] 的值将增加到 1 并且 !seen[$2,$1] 将为假.
    • count共保留第三列
    $ awk -f avn.awk file
    xx,4,40,2
    yy,4,60,2
    zz,1,10,1
    

    【讨论】:

      【解决方案2】:

      使用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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-11
        • 1970-01-01
        • 2017-02-16
        • 2013-05-07
        • 2014-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多