Uniq元素提取

Ang*_*elo 2 bash shell unique

我有一个制表符分隔文件,如下所示:

ABCA2   chr9    139021506   139043195
ABCA2   chr9    139021506   139042561
ABCC1   chr16   15950934    16144431
ABCC1   chr16   15950934    16144431
ABCC1   chr16   15950934    16144431
ABCC1   chr16   15950934    16144431
Run Code Online (Sandbox Code Playgroud)

我想基于列提取值,如第ABCA22,3列中的值,并且4应该只提取一次,这是第一次在column1中出现名称.

理想的输出是:

ABCA2   chr9    139021506   139043195
ABCC1   chr16   15950934    16144431
Run Code Online (Sandbox Code Playgroud)

谢谢

Wil*_*ell 7

你的问题的陈述是模糊的,但我解释它意味着如果尚未看到第一列中的条目,你只想输出一行.我不知道为什么这个被标记python,因为awk显然是正确的工具:

awk '{if( !seen[$1]++ ) print }' input-file
Run Code Online (Sandbox Code Playgroud)

或者,更简单

awk '! a[$1]++' input-file
Run Code Online (Sandbox Code Playgroud)


And*_*ahl 5

使用您的示例输入 file.txt,uniq --check-chars=5 file.txt给出以下输出:

ABCA2 chr9 139021506 139043195
ABCC1 chr16 15950934 16144431
Run Code Online (Sandbox Code Playgroud)

如您所见,它仅限于比较每行的前5个字符.

编辑:

正如William Pursell指出的那样,uniq假设文件已经排序.另一种方法是使用sort:

$ sort --key=1,1 --unique file.txt
ABCA2 chr9 139021506 139043195
ABCC1 chr16 15950934 16144431
$
Run Code Online (Sandbox Code Playgroud)

请务必注意下面的William Pursells评论:输入数据的排序对于解决上述问题并非绝对必要.如果速度是一个问题/数据量很大,记住看到的键的线性解决方案(例如awk威廉姆斯答案中的灵魂倾向)更好.