Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何根据特定字段中的重复值删除行?_Shell_Sorting - Fatal编程技术网

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