给定这个输入表:
pac1 xxx
pac1 yyy
pac1 zzz
pac2 xxx
pac2 uuu
pac3 zzz
pac3 uuu
pac4 zzz
我需要将频率添加到第三列,如下所示:
pac1 xxx 2/3
pac1 yyy 1/3
pac1 zzz 3/3
pac2 xxx 2/2
pac2 uuu 2/2
pac3 zzz 2/2
pac3 uuu 2/2
pac4 zzz 3/1
其中第一个数字是第二列中出现的次数。
awk '{print $2}' input | sort | uniq -c
斜杠后的数字是第一列的唯一出现次数:
awk '{print $1}' input | sort | uniq -c
我想在 awk 中使用实现。
EDIT:
请修改输出 - 第一列是名称,我需要计算第一列中出现了多少个 uniq 名称,例如:
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
所以唯一的名称只有 pac1,pac2,pac3,pac 4 => 4
像这样的东西:
occur=$(awk '{print $1}' input | sort | wc -l)
awk -v occur=$occur '{col2[$2]++} {print $0, col2[$2] "/" occur}' file
A想避免变量$出现。
只需读取文件两次:首先计算值并将它们存储在数组中,然后打印其值:
$ awk 'FNR==NR {col1[$1]++; col2[$2]++; next} {print $0, col2[$2] "/" col1[$1]}' file file
pac1 xxx 2/3
pac1 yyy 1/3
pac1 zzz 3/3
pac2 xxx 2/2
pac2 uuu 2/2
pac3 zzz 3/2
pac3 uuu 2/2
pac4 zzz 3/1
The FNR==NR {things; next}
是在读取第一个文件时执行操作的技巧。它基于使用FNR
and NR
:前者表示记录的字段编号,后者表示记录的编号。这意味着 FNR 包含当前文件的行数,而 NR 包含到目前为止已读取的总体行数,使得FNR==NR
仅在读取第一个文件时为 true。通过添加next
我们跳过当前行并跳到下一行。
查找更多信息惯用的 awk http://backreference.org/2010/02/10/idiomatic-awk/.
关于您的更新:如果您希望最后一项包含第一列中不同值的计数,只需检查创建的数组的长度。这将告诉您它包含的许多不同索引,以及您想要的值:
$ awk 'FNR==NR {col1[$1]++; col2[$2]++; next} {print $0, col2[$2] "/" length(col1)}' file file
pac1 xxx 2/4
pac1 yyy 1/4
pac1 zzz 3/4
pac2 xxx 2/4
pac2 uuu 2/4
pac3 zzz 3/4
pac3 uuu 2/4
pac4 zzz 3/4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)