我有一个正在使用的文件的一小段:
ENSDARG00000032737 ENSDARP00000120731
ENSDARG00000032737 ENSDARP00000049290
ENSDARG00000061051 ENSDARP00000081062
ENSDARG00000061051
ENSDARG00000061051 ENSDARP00000129708
我只想打印第一列中每个唯一值的第一个实例和第二列中的相应值,所以我想要的输出是:
ENSDARG00000032737 ENSDARP00000120731
ENSDARG00000061051 ENSDARP00000081062
有没有一种简单的方法可以使用 awk 或 uniq 或类似的东西来完成此任务?
任何帮助,将不胜感激。
答案1
POSIX AWK:
m1[$1] == 0 {
m1[$1] = 1
print
}
对于每行:
- 查看“数据库”中是否存在第一列
- 如果没有,添加到“数据库”并打印整行
答案2
$ sort -s -k1,1 -u file
ENSDARG00000032737 ENSDARP00000120731
ENSDARG00000061051 ENSDARP00000081062
这仅根据第一列对文件进行排序。这样做时,它会忽略第一列已被看到的行。
大多数实现sort
都有一个非标准-s
选项(在上面的命令中使用),以保证它将使用“稳定”的排序算法。稳定的排序算法不会改变具有相同键的条目的顺序(在您的情况下为第一列)。
但请注意,较长的文字记录(Ensembl 和哈瓦那都 100% 同意)ENSDARG00000032737基因是 ENSDART00000049291,其编码为 ENSDARP00000049290,而不是 ENSDARP00000120731。但这不关我的事。
答案3
这个惯用的解决方案将在每个 UNIX 机器上的任何 shell 中使用任何 awk 来稳健地工作:
$ awk '!seen[$1]++' file
ENSDARG00000032737 ENSDARP00000120731
ENSDARG00000061051 ENSDARP00000081062
答案4
刚刚发布我的尝试就已经提供了最佳解决方案
for i in `awk '{if(!seen[$1]++)print $1}' filename`; do sed -n '/'$i'/{p;q}' filename; done
输出
ENSDARG00000032737 ENSDARP00000120731
ENSDARG00000061051 ENSDARP00000081062