按字母顺序对 Unix 进行排序,然后按数字排序,没有按我的预期工作

按字母顺序对 Unix 进行排序,然后按数字排序,没有按我的预期工作

抱歉,如果这是一个重复的问题,但我无法在此处或文档中找到我正在寻找的答案。

我有一个如下所示的文件:

chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr4_oligo95    50  100
chr5_oligo1 50  100
chr4_oligo4 150 200

所需的输出如下所示:

chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr4_oligo95    50  100
chr4_oligo4 150 200
chr5_oligo1 50  100

开头的模式(例如 chr#_oligo#)仅与 chr# 相关,这意味着所有 chr1 应该是第一个,然后是 chr2,然后是 chr3 等,但我想按组对这些子字符串进行数字排序如上面所需的输出所示。所以,我想知道如何在第一列的情况下按字母顺序排序,然后保持该顺序(chr1->chrN),按数字对每个数据块进行排序。

如果我的措辞不适合这个问题或者重复,我深表歉意。试

sort -k1,1 -nk2

确实按数字正确排序,但没有保持第一个排序完整(将第一列打乱,并将所有行与第 2 列和第 3 列放在一起,如下所示:

50   100

我使用的是 Mac OS X。

编辑:我想更改第一列中的一些示例以显示更多我正在寻找的内容。如果第一列中的名称按数字顺序排列,则 gsort -V 效果很好,但在我的数据集中,情况并非总是如此。

我想基本上按第 2 列迭代地对每个子组(在本例中为 chr1、chr2 等)进行排序。我意识到这可以通过对每个命令执行 grep 然后在第 2 列上对其进行排序来轻松完成,但我想知道 sort 或另一个 unix 命令是否可以单独完成此操作。

答案1

sort -k1,1 -nk2与 相同sort -k1,1 -n -k2,与 相同sort -n -k1,1 -k2,与数值对于所有键,排序是全局打开的。

要仅按数字对第二个键进行排序,您需要添加n到该排序键描述,如下所示:

sort -k1,1 -k2n

或者:

sort -k1,1 -k2,2n

使用n和使用默认字段分隔符2是一样的2,22将是从第二个字段开始的行的一部分,但当解释为数字时,它与单独的第二个字段相同 ( 2,2)。

在这里,您还可以按数字顺序对后面的数字进行排序chr,然后按字母顺序对第一个字段的其余部分进行排序,然后对第二个字段进行数字排序:

sort -k1.4n -k1,1 -k2n

答案2

在第一个字段按字母顺序排序,在第二个字段按数字排序给出(在输出中,-- chr4_oligo95 在 ch4_oligo4 之前)

sort -k1,1 -k2n,2n file 
chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr4_oligo4 150 200
chr4_oligo95    50  100
chr5_oligo1 50  100

相关内容