我有这样的行:
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列不应按字母顺序排序。必须根据找到的值的数量(以逗号分隔)对它进行排序。
提前谢谢
答案 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
对此非常了解的专家感到敬畏。
我希望他们中的一个能提出一个更优雅的命令,但是现在,这会有所帮助。