按字符串键排序,然后按整数排序(bash)

时间:2016-04-07 00:00:50

标签: bash sorting

提前感谢任何建议。

我尝试按制表符分隔的字段对文件进行排序(如下所示)。重要的字段是字段1和2。

ID(按字符串值排序),然后是较大字符串中的起始位置(按数字排序)。

KI270036.1  5137    5523    -1
KI270036.1  5215    5636    -1
**KI270036.1    546     1448    -1**
KI270036.1  6364    7425    -1
KI270036.1  8687    9529    -1
KI270041.1  1957    2343    1
KI270041.1  3114    3423    1
KI270041.1  4792    5439    1
KI270041.1  5703    6308    1

这是我试图排序的表格的一个例子。请注意,第一个字段按顺序排列,但根据我的规范,粗体字段出现故障。

我输入的命令是:

sort -g -t '        ' -k 1,2 my_file.txt

如何更改此项以实现按ID分组的记录,然后通过第二个字段以数字方式排序?

我在这个例子中寻找的输出是:

**KI270036.1    546     1448    -1**
KI270036.1  5137    5523    -1
KI270036.1  5215    5636    -1
KI270036.1  6364    7425    -1
KI270036.1  8687    9529    -1
KI270041.1  1957    2343    1
KI270041.1  3114    3423    1
KI270041.1  4792    5439    1
KI270041.1  5703    6308    1

2 个答案:

答案 0 :(得分:2)

你可以定义多个键,因为第一个字段是固定大小的格式,不需要特殊标记(词法排序很好),第二个字段指定数字。

$ sort -k1,1 -k2n file
删除明星之后

你会得到什么

KI270036.1  546     1448    -1
KI270036.1  5137    5523    -1
KI270036.1  5215    5636    -1
KI270036.1  6364    7425    -1
KI270036.1  8687    9529    -1
KI270041.1  1957    2343    1
KI270041.1  3114    3423    1
KI270041.1  4792    5439    1
KI270041.1  5703    6308    1

答案 1 :(得分:0)

两次通过sort,第二次通过稳定排序:

$ sort my_file.txt | sort -g -s -k 2
**KI270036.1    546     1448    -1**
KI270041.1  1957    2343    1
KI270041.1  3114    3423    1
KI270041.1  4792    5439    1
KI270036.1  5137    5523    -1
KI270036.1  5215    5636    -1
KI270041.1  5703    6308    1
KI270036.1  6364    7425    -1
KI270036.1  8687    9529    -1

或者,

$ sort -g -s -k 2  my_file.txt | sort -s
**KI270036.1    546     1448    -1**
KI270036.1  5137    5523    -1
KI270036.1  5215    5636    -1
KI270036.1  6364    7425    -1
KI270036.1  8687    9529    -1
KI270041.1  1957    2343    1
KI270041.1  3114    3423    1
KI270041.1  4792    5439    1
KI270041.1  5703    6308    1

取决于主要排序键(您没有示例输出且模糊不清......)