Bash排序选项卡基于特定列分隔行,其中大多数值以逗号分隔

时间:2019-02-11 09:58:52

标签: bash sorting

我有这样的行:

rs6605071   chr1:962943 XM_017002478.2  stuff1,stuff2                           morestuff
rs6605071   chr1:962943 XM_017002479.1  stuff1,stuff2,stuff3,stuff4,stuff5      morestuff
rs6605071   chr1:962943 XR_001737138.1  stuff1,stuff2,stuff3                    morestuff
rs6605071   chr1:962943 XR_001737478.1  stuff1,stuff2,stuff3,stuff4             morestuff
rs6605071   chr1:962943 NC_426604.3     stuff1                                  morestuff
rs6605071   chr1:962943 NC_426605.3     stuff1                                  morestuff

我想按所需输出的第四列对行进行排序:

rs6605071   chr1:962943 XM_017002479.1  stuff1,stuff2,stuff3,stuff4,stuff5      morestuff
rs6605071   chr1:962943 XR_001737478.1  stuff1,stuff2,stuff3,stuff4             morestuff
rs6605071   chr1:962943 XM_017002478.2  stuff1,stuff2                           morestuff
rs6605071   chr1:962943 NC_426604.3     stuff1                                  morestuff
rs6605071   chr1:962943 NC_426605.3     stuff1                                  morestuff

在bash中达到这种效果的最佳方法是什么?

编辑1 :第4列不应按字母顺序排序。必须根据找到的值的数量(以逗号分隔)对它进行排序。

提前谢谢

1 个答案:

答案 0 :(得分:1)

所以这有点hacky,但是可以用。我无法告诉您的距离(如果是制表符或空格),但是类似的方法会起作用,并且可以轻松进行操作:

 cat asdfasdf.txt | awk '{print gsub(/,/,","),$1,$2,$3,$4,$5}' | sort -r | cut -d' ' -f2,3,4,5,6

现在,必须有一种方法可以在awk中完全做到这一点,而我一直对awk对此非常了解的专家感到敬畏。

我希望他们中的一个能提出一个更优雅的命令,但是现在,这会有所帮助。