按字母順序對 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

相關內容