【发布时间】: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 是的,看到你的答案后意识到了...... ++