Ger*_*oge 1 linux bash awk sed
我有一个关于我以前的成功回答问题一个问题在这里通过@fedorgui.
我有一张桌子:
pac1 xxx
pac1 yyy
pac1 zzz
pac2 xxx
pac2 uuu
pac3 zzz
pac3 uuu
pac4 zzz
Run Code Online (Sandbox Code Playgroud)
我需要像这样计算输出:
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
Run Code Online (Sandbox Code Playgroud)
第一列中的第一个数字是第二列中的唯一出现次数(在这种情况下,xxx在第二列中出现2,而uniq第一列出现在第二列中 4 => 2/4
解决方案在awk中工作在这里:
$ awk 'FNR==NR {col1[$1]++; col2[$2]++; next} {print $0, col2[$2] "/" length(col1)}' file file
Run Code Online (Sandbox Code Playgroud)
但我的输入可能有重复的行,如:
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
Run Code Online (Sandbox Code Playgroud)
我需要进行相同的计算,但仅针对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
Run Code Online (Sandbox Code Playgroud)
这更复杂我有数千行.谢谢你的任何想法.
添加到第二个数组时,只需检查该行是否唯一.
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
Run Code Online (Sandbox Code Playgroud)
或者如果你的例子中的行末尾没有随机空格,你可以使用$0而不是$1,$2
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |