【问题标题】:Calculate statistic using awk使用 awk 计算统计量
【发布时间】:2017-06-20 16:02:45
【问题描述】:

我有一个关于@fedorgui 之前成功回答的问题here 的问题。

我有一张桌子:

pac1 xxx 
pac1 yyy
pac1 zzz
pac2 xxx
pac2 uuu
pac3 zzz
pac3 uuu
pac4 zzz

我需要这样计算输出:

pac1 xxx 2/4
pac1 yyy 1/4
pac1 zzz 3/4
pac2 xxx 2/4
pac2 uuu 2/4
pac3 zzz 2/4
pac3 uuu 2/4
pac4 zzz 3/4

其中第一个数字是第二列中的唯一出现/第一列中的唯一出现(在这种情况下,xxx 在第二列中出现 2,而 uniq 第一列是 4 => 2/4

在 awk 中的解决方案在这里:

$ awk 'FNR==NR {col1[$1]++; col2[$2]++; next} {print $0, col2[$2] "/" length(col1)}' file file

但我的输入可能有重复的行,例如:

pac1 xxx
pac1 xxx 
pac1 xxx  
pac1 yyy
pac1 zzz
pac2 xxx
pac2 xxx
pac2 xxx
pac2 uuu
pac3 zzz
pac3 uuu
pac4 zzz
pac4 zzz

我需要进行相同的计算,但只针对 uniq 行,并将此统计信息添加到所有行,例如(不计算重复行):

pac1 xxx 2/4
pac1 xxx 2/4
pac1 xxx 2/4
pac1 yyy 1/4
pac1 zzz 3/4
pac2 xxx 2/4
pac2 xxx 2/4
pac2 xxx 2/4
pac2 uuu 2/4
pac3 zzz 2/4
pac3 uuu 2/4
pac4 zzz 3/4
pac4 zzz 3/4

这更复杂,我有数千行。谢谢你的任何想法。

【问题讨论】:

  • 数字和计算与示例 1 相同 - 我需要进行如下计算:uniq
  • 试试FNR==NR {if(!seen[$0]++){col1[$1]++; col2[$2]++;} next}(但你需要从行尾删除多余的空格)...否则试试if(!seen[$1$2]++)
  • 我试过了,但问题是,这是文件的一部分 - 我有更多的列,不是唯一的,所以我只需要检查这两列的 uniq。
  • @Sundeep 最好使用seen[$1,$2],因为字段可以在没有, 的情况下重叠
  • @123 是的,看到你的答案后意识到了...... ++

标签: linux bash awk sed


【解决方案1】:

添加到第二个数组时只需检查该行是否唯一。

awk 'FNR==NR{a[$1];b[$2]+=!c[$1,$2]++;next}{print $0, b[$2] "/" length(a)}' test{,}

pac1 xxx 2/4
pac1 xxx  2/4
pac1 xxx   2/4
pac1 yyy 1/4
pac1 zzz 3/4
pac2 xxx 2/4
pac2 xxx 2/4
pac2 xxx 2/4
pac2 uuu 2/4
pac3 zzz 3/4
pac3 uuu 2/4
pac4 zzz 3/4
pac4 zzz 3/4

或者,如果行尾没有像您的示例那样的随机空格,您可以使用 $0 而不是 $1,$2

【讨论】:

  • 谢谢,我会测试一下 - 我不能使用 $0,因为我有更多的列,不是唯一的。
猜你喜欢
  • 2012-07-02
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2020-07-26
相关资源
最近更新 更多