为列的每个唯一值输出整行一次(Bash)

Bed*_*des 7 bash shell awk uniq

这肯定是一项微不足道的任务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
Run Code Online (Sandbox Code Playgroud)

我想在第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
Run Code Online (Sandbox Code Playgroud)

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

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...
Run Code Online (Sandbox Code Playgroud)

最后一点,它需要将作为其他肽的子串的肽作为不同的值进行处理(例如VSSILED和VSSILEDKILSR).谢谢 :)

flo*_*olo 17

只需使用排序:

sort -k 2,2 -u file
Run Code Online (Sandbox Code Playgroud)

-u删除重复项(如你想),以及-k 2,2品牌只是场2排序字段(重复检查时,因此忽略其他).

  • 太棒了...如果您想获得前X个唯一条目,则可以使用“ sort”对文件进行排序,而不是仅获得一个唯一条目,您可以使用我在此处创建的一个小应用程序: https://github.com/danieliversen/MiscStuff/blob/master/scripts/findTopUniques.java (2认同)

Ste*_*eve 12

一种方式使用awk:

awk '!array[$2]++' file.txt
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)