如何在 Unix 中使用 sort 按字母数字排序?比看起来更复杂
我试图使用 unix sort
命令以“直观”/自然的方式按字母数字顺序对一串字母和数字进行排序,但无法正确排序。我有这个文件:
$ cat ~/headers
@42EBKAAXX090828:6:100:1699:328/2
@42EBKAAXX090828:6:10:1077:1883/2
@42EBKAAXX090828:6:102:785:808/2
我想按字母数字顺序对其进行排序,直观上 @42EBKAAXX090828:6:10:...
是第一个(因为 10
小于 >100
和 102
),第二个是 @42EBKAAXX090828:6:100...
第三个是@42EBKAAXX090828:6:102:204:1871/2
。
我知道建议在行内的特定位置进行排序,但是这里 :
的位置可能会有所不同,因此这不是一个通用且可行的解决方案。
我尝试过:
sort --stable -k1,1 ~/headers > foo
使用 -n
和 -u
参数的各种组合,但它没有给出正确的顺序。
如何通过使用 sort
的 bash 或 Python 有效地完成此操作?我想将此应用于大小约为 4-5 GB 的文件,因此包含数百万行。
谢谢!
I'm trying to sort a string of letters and numbers alphanumerically in an "intuitive"/natural way using the unix sort
command, but cannot get it to sort properly. I have this file:
$ cat ~/headers
@42EBKAAXX090828:6:100:1699:328/2
@42EBKAAXX090828:6:10:1077:1883/2
@42EBKAAXX090828:6:102:785:808/2
I'd like to sort it alphanumerically, where intuitively @42EBKAAXX090828:6:10:...
is first (since 10
is smaller than 100
and 102
), second is @42EBKAAXX090828:6:100...
and third is @42EBKAAXX090828:6:102:204:1871/2
.
I know that suggest sorting on a particular position within the line, but the position of the :
here could vary and so this would not be a general and workable solution here.
I tried:
sort --stable -k1,1 ~/headers > foo
with various combinations of -n
and -u
parameters but it does not give the correct ordering.
How can this be done efficiently, either from bash using sort
or from Python? I'd like to apply this to files that are round 4-5 GB in size, so containing millions of lines.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
-V
选项似乎可以执行您想要的操作 - 自然排序。显然用于版本号(因此选择字母)输出
the
-V
option appears to do what you want - natural sorting. Intended for version numbers apparently (hence the letter chosen)outputs
它按字母顺序对其进行排序,就像您的示例中一样。
10:
出现在100
和102
之后的原因是10:
是在它们之后,因为冒号:
位于 中的9
字符之后ASCII 图表。如果您想对以冒号分隔的第三个字段进行排序,请尝试以下操作:
It is sorting it alphabetically as it is in your example. The reason
10:
is coming after100
and102
is that10:
is after them, since the colon:
is after the9
character in the ASCII chart.If you're wanting to sort on the third field delimited by a colon, try this:
这通常称为自然排序。这是适用于您的示例数据集的一种方法。
我在这里找到了这个改善了一点。
This is usually called Natural Sorting. Here's one way that works for your example data set.
I found this here and improved a bit.