Linux
Linux中的排序問題
我正在對具有基因名稱及其表達值的文件進行排序。所有文件都有相同的確切行數,但是排序後某些基因的定位有所不同。這很奇怪。下面是兩個這樣的文件的排序版本。
例如:
Cxx1c 25.1695 Cxxc1 15.2228 Cxxc4 0.952061 Cxxc5 3.13309 **Cyb5 157.426** Cyb561 0.425933 Cyb561a3 9.55082 Cyb561d1 4.00422 Cyb561d2 3.04411 Cyb5b 16.7622 Cyb5d1 7.25191 Cyb5d2 2.85109 Cyb5r1 15.2511 Cyb5r2 0.48748
另一個文件有這種排序。基本上,在這個文件中 Cyb5 出現在 Cyb561d2 基因之後。我怎樣才能有完全相同的排序順序。有什麼參數可以做這樣的事情嗎?
Cxx1c 44.9795 Cxxc1 19.0346 Cxxc4 1.17429 Cxxc5 2.71589 **Cyb561 7.11003** Cyb561a3 1.97601 Cyb561d1 2.13004 Cyb561d2 2.03376 Cyb5 64.074 Cyb5b 14.5329 Cyb5d1 12.0212 Cyb5d2 1.47763 Cyb5r1 10.5463 Cyb5r2 0
這是我生成上述排序文件的程式碼:
for i in *.txt; do sort -d $i >$i.sort done
您目前正在對整行進行排序,但似乎您只想對第一列進行排序。使用您目前編寫命令的方式,這些列基本上將連接在一起,例如:
Cyb5 157.426 -> Cyb5157426 Cyb561 0.425933 -> Cyb5610425933
對比
Cyb561 7.11003 -> Cyb561711003 Cyb5 64.074 -> Cyb564074
要僅對第一列進行排序,您需要使用以下命令:
sort -d -k1,1
Cyb5 157.426
先排序Cyb561 0.425933
,Cyb5 64.074
後排序,Cyb561 7.11003
因為在您的語言環境中,在第一次排序過程中會忽略空格,因此順序更接近英語詞典的順序。例如,在字典中,您將有
a priori
in-betweenapiary
和Arrival
.在這裡,第一次比較首先比較與
Cyb5 157.426
,因為空格字元的第一個權重是IGNORE。Cyb561 0.425933``Cyb5157.426``Cyb5610.425933
如果您想避免這種特殊處理,您可以將區域設置更改
C
為僅基於字元程式碼點值的順序。LC_ALL=C sort -d file
或者正如@Swiss 所說,只對第一個欄位進行排序:
sort -d -k1,1 file
但是請注意,欄位分隔符是從非空白到空白的過渡,並且空白包含在欄位中。
所以:
b x a x
with
sort -d -k1,1
仍將被排序為a x b x
在您的語言環境中,因為空格被忽略,但是:
b x a x
在 C 語言環境中,空格字元排在
a
.您可能希望添加該
-b
選項,以便始終忽略前導空格,而不管語言環境如何。或者,如果您確實希望首先對以空格開頭的行進行排序,請將語言環境修復為 C。