抱歉,如果这是一个重复的问题,但我无法在此处或文档中找到我正在寻找的答案。
我有一个如下所示的文件:
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,2
。2
将是从第二个字段开始的行的一部分,但当解释为数字时,它与单独的第二个字段相同 ( 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