在文本文件中按列对唯一元素进行排序
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 +,-,-
我有一个制表符分隔的文件,如
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 +,-,-
我尝试使用像
这样的扩展 grepcut -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 +,-,-