Shell 如何根据特定字段中的重复值删除行?
例如,我有一个染色体文件:Shell 如何根据特定字段中的重复值删除行?,shell,sorting,Shell,Sorting,例如,我有一个染色体文件: Chr1 0 145 Region1 Chr1 450 500 Region2 Chr1 499 549 Region2 ... 我想删除第三行,因为Region2出现在第2行。如有任何建议,我将不胜感激。谢谢大家! 假设您有一个制表符分隔符,这应该可以使用awk: awk -F'\t' '!x[$4]++' file.txt 如果不是制表符,只需将“\t”更改为任何分隔符,因为默认情况下awk假定为空格 下面是一个显示结果的示例: 输入:
Chr1 0 145 Region1
Chr1 450 500 Region2
Chr1 499 549 Region2
...
我想删除第三行,因为Region2出现在第2行。如有任何建议,我将不胜感激。谢谢大家! 假设您有一个制表符分隔符,这应该可以使用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:
当一个元素被添加到以前从未遇到过的数组中时,可以进行打印。这是一个非常标准的重复数据消除单行程序,只是为了关注特定字段而不是整个行而进行了修改
它的工作原理是将第四个字段添加到关联数组中,并对其进行后期递增,因此第一次添加时返回0,并对数组中的每个后续重复项进行递增。加上!为了逆转这种逻辑,我们将打印post增量是否为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
这里发生的事情应该更加明显
~$ awk -F'\t' '{print x[$4]++}' file.txt
0
0
1
2
0
1