Linux

Linux中的排序問題

  • March 7, 2017

我正在對具有基因名稱及其表達值的文件進行排序。所有文件都有相同的確切行數,但是排序後某些基因的定位有所不同。這很奇怪。下面是兩個這樣的文件的排序版本。

例如:

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.425933Cyb5 64.074後排序,Cyb561 7.11003因為在您的語言環境中,在第一次排序過程中會忽略空格,因此順序更接近英語詞典的順序。

例如,在字典中,您將有a prioriin-betweenapiaryArrival.

在這裡,第一次比較首先比較與Cyb5 157.426,因為空格字元的第一個權重IGNORECyb561 0.425933``Cyb5157.426``Cyb5610.425933

如果您想避免這種特殊處理,您可以將區域設置更改C為僅基於字元程式碼點值的順序。

LC_ALL=C sort -d file

或者正如@Swiss 所說,只對第一個欄位進行排序:

sort -d -k1,1 file

但是請注意,欄位分隔符是從非空白到空白的過渡,並且空白包含在欄位中。

所以:

b x
a x

withsort -d -k1,1仍將被排序為

a x
b x

在您的語言環境中,因為空格被忽略,但是:

b x
a x

在 C 語言環境中,空格字元排在a.

您可能希望添加該-b選項,以便始終忽略前導空格,而不管語言環境如何。或者,如果您確實希望首先對以空格開頭的行進行排序,請將語言環境修復為 C。

引用自:https://unix.stackexchange.com/questions/349599