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

答案1

Cyb5 157.426排序在前,Cyb561 0.425933Cyb5 64.074排序在后,Cyb561 7.11003因为在您的语言环境中,第一次排序过程中会忽略空格,因此顺序更接近英语词典的顺序。

例如,在字典中,您可以在和a priori之间找到。apiaryArrival

这里,比较Cyb5 157.426与在第一遍中Cyb561 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。

答案2

您当前正在对整行进行排序,但似乎您只想对第一列进行排序。按照当前编写命令的方式,这些列基本上将连接在一起,例如:

Cyb5    157.426  -> Cyb5157426
Cyb561  0.425933 -> Cyb5610425933

Cyb561  7.11003 -> Cyb561711003
Cyb5    64.074  -> Cyb564074

要仅对第一列进行排序,您需要使用以下命令:

sort -d -k1,1

相关内容