使用不同列的bash排序错误?

时间:2015-05-15 14:02:26

标签: bash sorting multiple-columns cut

我正在处理一个文件,其中包含3个值,一个ID(它们恰好是蛋白质ID,以防您感到好奇),一个值,然后是另一个值。它是制表符分隔的,所以它看起来像这样:

A2M     0.979569315988908       1
AACS    0.925340159491081       1
AAGAB   0.982296215686199       1
AAK1    0.736903840140103       1
AAMP    0.00589711816127862     0.138868449447202
AARS2   1       1
AARS    3.13300124295614e-05    0.00212792325492566
AARSD1  0.527417792161261       1
AASDH   0.869909252023668       1
AASDHPPT        0.763918221284724       1
AATF    0.691907759125663       1
ABAT    0.989693691462661       1
ABCA1   0.601194017450064       1
ABCA5   1       1
ABCA6   1       1

我有兴趣按字母顺序对这些ID进行排序并提取各种值。但是,我注意到排序对ID进行了不同的排序,具体取决于我提取的内容。当我执行:

    cut --fields\=1,2 input.txt|sort --key=1

生成的文件是:

A2M     0.979569315988908
AACS    0.925340159491081
AAGAB   0.982296215686199
AAK1    0.736903840140103
AAMP    0.00589711816127862
AARS2   1
AARS    3.13300124295614e-05 
AARSD1  0.527417792161261
AASDH   0.869909252023668
AASDHPPT        0.763918221284724
AATF    0.691907759125663
ABAT    0.989693691462661
ABCA1   0.601194017450064
ABCA5   1
ABCA6   1

但是当我执行时:

cut --fields\=1,3 input.txt|sort --key=1

我得到了

A2M     1
AACS    1
AAGAB   1
AAK1    1
AAMP    0.138868449447202
AARS    0.00212792325492566
AARS2   1
AARSD1  1
AASDH   1
AASDHPPT        1
AATF    1
ABAT    1
ABCA1   1
ABCA5   1
ABCA6   1

请注意,AARS和AARS2的位置是切换的,因为我只是根据第一列进行排序,所以它们不应该被切换。我从来没有看到任何类似的行为,我现在已经使用bash一段时间了。这是一个错误,还是我做错了什么?

3 个答案:

答案 0 :(得分:4)

--key=1选项告诉sort使用从第一行到第一行的所有“字段”来对输入进行排序。正如@rici首先观察到的那样,默认情况下这是一个区域设置敏感的排序,并且在许多区域设置中,为了整理目的,会忽略空格。这就是这里似乎发生的事情。

如果您想对蛋白质ID上的进行排序,那么就是这样:

cut --fields=1,2 input.txt | sort --key=1,1
cut --fields=1,3 input.txt | sort --key=1,1

@rici解释了如何通过指定考虑空格的整理顺序来解决问题。

答案 1 :(得分:2)

您正在使用区域设置感知排序(这是默认排序)。在许多语言环境中,在排序顺序中明确忽略空格;这一点,再加上你的密钥从第一个字段延伸到行尾(这意味着--key选项是多余的)这一事实,实际上意味着这些行被排序,好像字段是连接在一起而没有干预空格。

这里有更长的解释:https://stackoverflow.com/a/27951508/1566221

我的偏好是使用LC_COLLATE=C sort ...进行非区域设置感知排序。 (例如,定义alias csort="LC_COLLATE=C sort")。在这种情况下,您还可以使用-k1,1显式终止排序键。如果您的第一列是唯一的,那就足够了。

答案 2 :(得分:0)

我认为那种跳过标签...净效应是AARS0.00212792325492566在AARS21之前,但AARS21在AARS3.13300124295614e-05之前。请参阅this quesiton

以下内容应该有效

cut -f1,2 input.txt | sort -t$'\t'

不幸的是它没有,但我认为这剥离标签是导致问题的原因。