如何根据特定字段中的重复值删除行?

时间:2015-03-24 21:04:50

标签: shell sorting

例如,我有这个染色体文件:

Chr1  0   145   Region1
Chr1  450  500  Region2
Chr1  499  549  Region2
...

我想删除第三行,因为Region2出现在第2行。我非常感谢任何建议。谢谢!

1 个答案:

答案 0 :(得分:0)

假设您有一个制表符分隔符,这应该可以使用awk:

awk -F'\t' '!x[$4]++' file.txt

如果不是标签,只需更改' \ t'无论分隔符是什么,因为默认情况下awk假定为空格。

以下是显示结果的示例:

输入:

~$ cat file.txt
Chr1    0       145     Region1
Chr1    450     500     Region2
Chr1    499     549     Region2

AWK:

awk -F'\t' '!x[$4]++' file.txt
Chr1    0       145     Region1
Chr1    450     500     Region2

这可以通过在将元素添加到之前未遇到的数组时进行打印。这是一个非常标准的重复数据删除单线程,只是为了关注特定领域而不是整条线路。

它的工作原理是将第4个字段添加到关联数组并将其递增,因此它在第一次添加时返回0,并随着数组中每个后续重复项而递增。加入!为了扭转这种逻辑,如果后增量为0,我们将打印,而不是其他任何内容,即每次后续重复添加时都会打印。

例如,在文件中添加更多行:

~$ cat file.txt
Chr1    0       145     Region1
Chr1    450     500     Region2
Chr1    499     549     Region2
Chr1    499     555     Region2
Chr1    499     555     Region3
Chr1    499     556     Region3

然后更改我们的打印以显示我们正在测试的输出:

~$ awk -F'\t' '{print x[$4]++}' file.txt
0
0
1
2
0
1

这里发生的事情应该更加明显。