10

这肯定是一项微不足道的任务awk,但今天早上让我摸不着头脑。我有一个类似于以下格式的文件:

pep> AEYTCVAETK     2   genes ADUm.1024,ADUm.5198,ADUm.750
pep> AIQLTGK        1   genes ADUm.1999,ADUm.3560
pep> AIQLTGK        8   genes ADUm.1999,ADUm.3560
pep> KHEPPTEVDIEGR  5   genes ADUm.367
pep> VSSILEDKTT     9   genes ADUm.1192,ADUm.2731
pep> AIQLTGK        10  genes ADUm.1999,ADUm.3560
pep> VSSILEDKILSR   3   genes ADUm.2146,ADUm.5750
pep> VSSILEDKILSR   2   genes ADUm.2146,ADUm.5750

我想为第 2 列中肽的每个不同值打印一行,这意味着上述输入将变为:

pep> AEYTCVAETK     2   genes ADUm.1024,ADUm.5198,ADUm.750
pep> AIQLTGK        1   genes ADUm.1999,ADUm.3560
pep> KHEPPTEVDIEGR  5   genes ADUm.367
pep> VSSILEDKTT     9   genes ADUm.1192,ADUm.2731
pep> VSSILEDKILSR   3   genes ADUm.2146,ADUm.5750

到目前为止,这是我尝试过的,但显然我不需要:

awk '{print $2}' file | sort | uniq
# Prints only the peptides...
awk '{print $0, "\t", $1}' file |sort | uniq -u -f 4
# Altogether omits peptides which are not unique...

最后一件事,它需要将作为其他肽的子串的肽视为不同的值(例如 VSSILED 和 VSSILEDKILSR)。谢谢 :)

4

4 回答 4

20

只需使用排序:

sort -k 2,2 -u file

-u删除重复条目(如您所愿),并且仅-k 2,2将字段 2 设为排序字段(因此在检查重复项时忽略其余部分)。

于 2012-08-21T10:23:38.407 回答
15

一种使用方式awk

awk '!array[$2]++' file.txt

结果:

pep> AEYTCVAETK     2   genes ADUm.1024,ADUm.5198,ADUm.750
pep> AIQLTGK        1   genes ADUm.1999,ADUm.3560
pep> KHEPPTEVDIEGR  5   genes ADUm.367
pep> VSSILEDKTT     9   genes ADUm.1192,ADUm.2731
pep> VSSILEDKILSR   3   genes ADUm.2146,ADUm.5750
于 2012-08-21T10:22:23.430 回答
2

我会为此使用 Perl:

perl -nae 'print unless exists $seen{$F[1]}; undef $seen{$F[1]}' < input.txt

n开关与输入逐行工作,开关a将行拆分为@F数组。

于 2012-08-21T10:20:45.303 回答
2
awk '{if($2==temp){next;}else{print}temp=$2}' your_file

测试如下:

> awk '{if($2==temp){next;}else{print}temp=$2}' temp
pep> AEYTCVAETK         2       genes ADUm.1024,ADUm.5198,ADUm.750
pep> AIQLTGK            1       genes ADUm.1999,ADUm.3560
pep> KHEPPTEVDIEGR      5       genes ADUm.367
pep> VSSILEDKTT         9       genes ADUm.1192,ADUm.2731
pep> AIQLTGK            10      genes ADUm.1999,ADUm.3560
pep> VSSILEDKILSR       3       genes ADUm.2146,ADUm.5750
于 2012-08-21T10:35:40.083 回答