在文本文件中按列对唯一元素进行排序

Sorting unique elements column-wise in a text-file

我有一个制表符分隔的文件,如

chr1    4359314 4361314 Rp1 -
chr1    4492735 4494735 Sox17   -
chr1    4495330 4498354 Sox17,Sox17,Sox17,Sox17,Sox17,Sox17 -,-,-,-,-,-
chr1    4784698 4786739 Mrpl15,Mrpl15,Mrpl15,Mrpl15 -,-,-,-
chr1    4806788 4809237 Lypla1,Lypla1,Lypla1,RP24-426M1.3,Lypla1,Lypla1,Lypla1,Lypla1   +,+,+,+,+,+,+,+
chr1    4856814 4859038 Tcea1,Tcea1 +,+
chr1    5017735 5020539 Rgs20,Rgs20,Rgs20   -,-,-
chr1    5069018 5071285 Atp6v1h,Rgs20,Rgs20 +,-,-
chr1    5082080 5084154 Atp6v1h,Atp6v1h,Atp6v1h,Atp6v1h +,+,+,+
chr1    5587493 5589941 Oprk1,Oprk1,Oprk1   +,+,+

我想按第 5 列过滤掉,只过滤掉可以有任意数量和顺序的“+”或“-”的行,这意味着每行有多个实例,例如 +、-、+ 或 -、-、+ 或+,+,+,+,- 等,但应该混合使用 -,- 或 -,-,-,- 或 +,+,+

输出

chr1    5069018 5071285 Atp6v1h,Rgs20,Rgs20 +,-,-

我尝试使用像

这样的扩展 grep
cut -f5 file | egrep '(+.*-)|(-.*+)' | head

但我无法使其适用于每行的多个匹配项,任何顺序。 任何人都可以建议一种极简主义的方式(regex/one-liner)来做到这一点,而不指定不同的顺序。 (sed/awk 首选)

让我想到另一个问题。我可以 sort -u 但按列

cut -f5 file | tr ',' '\t'| sort -uk1???

输入

-
-
-,-,-,-,-,-
-,-,-,-
+,+,+,+,+,+,+,+
+,+
-,-,-
+,-,-
+,+,+,+
+,+,+

输出:

-
-
-
-
+
+
-
+-
+
+

我会使用以下 awk 命令:

awk ' !~ /^(\+,)*\+$/ &&  !~ /^(-,)*\-$/' file

它检查 </code>(第 5 列)是否包含 <code>+,..,+ 序列或 -,..,- 序列。如果不是,则打印该行。

输出:

chr1    5069018 5071285 Atp6v1h,Rgs20,Rgs20 +,-,-