首页 > 解决方案 > Bash 按列中的字符位置排序

问题描述

我想按第 2 列对以下文件进行排序,从第 7 位到第 9 位。

$ cat sample.bed
chr1    248956422       chr1:248956422
chr2    242193529       chr2:242193529
chr3    198295559       chr3:198295559
chr4    190214555       chr4:190214555
chr5    181538259       chr5:181538259
chr6    170805979       chr6:170805979
chr7    159345973       chr7:159345973
chrX    156040895       chrX:156040895
chr8    145138636       chr8:145138636
chr9    138394717       chr9:138394717

如图所示,我使用排序并获得以下输出:

$ sort -n -k2.7,2.9 sample.bed
chr4    190214555       chr4:190214555
chr6    170805979       chr6:170805979
chr5    181538259       chr5:181538259
chr2    242193529       chr2:242193529
chr8    145138636       chr8:145138636
chrX    156040895       chrX:156040895
chr3    198295559       chr3:198295559
chr9    138394717       chr9:138394717
chr1    248956422       chr1:248956422
chr7    159345973       chr7:159345973

排序更改行顺序,但不是基于我的参数。请注意, sort -k2,2 按预期工作:

$ sort -k2,2 sample.bed
chr9    138394717       chr9:138394717
chr8    145138636       chr8:145138636
chrX    156040895       chrX:156040895
chr7    159345973       chr7:159345973
chr6    170805979       chr6:170805979
chr5    181538259       chr5:181538259
chr4    190214555       chr4:190214555
chr3    198295559       chr3:198295559
chr2    242193529       chr2:242193529
chr1    248956422       chr1:248956422

我必须遗漏一些明显的东西......任何帮助将不胜感激。

标签: bashsorting

解决方案


的输出sort --debug非常有用:

# sort -n -k2.7,2.9 --debug
...
chr4    190214555       chr4:190214555
          ___
______________________________________
...

021从第一chr4行开始比较,因为它将前导空白视为属于该字段。你可以:

sort -n -k2.11,2.13

或忽略前导空格-b

sort -b -n -k2.7,2.9

推荐阅读