我正在处理一个文件,其中包含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一段时间了。这是一个错误,还是我做错了什么?
答案 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'
不幸的是它没有,但我认为这剥离标签是导致问题的原因。