【问题标题】:Bash: Sort text file by bytewise case sensitive sort command or using python sort commandBash:通过按字节区分大小写的排序命令或使用 python 排序命令对文本文件进行排序
【发布时间】:2016-06-10 17:31:28
【问题描述】:

文本文件
使用排序 -s (区分大小写)

Act
Bad
Bag
Card
East
about
across
back
ball
camera
canvas
danger
dark
early
edge

使用 sort -f(不区分大小写)

about
across
Act
back
Bad
Bag
ball
camera
canvas
Card
danger
dark
early
East
edge

以大写字母开头的单词在小写单词之间按字母顺序排序。

我想要的是大写单词在每个下一个字母的开头(大写按字母顺序排序):
预期输出

Act
about
across
Bad
Bag
back
ball
Card
camera
canvas
danger
dark
East
early
edge

如何使用 bash 或 python 排序命令实现这一点?

【问题讨论】:

    标签: python linux bash sorting case


    【解决方案1】:

    我成功了!这是(在 Python 中):

    import string
    
    words = [...]
    newwords = sorted(words, key=lambda x: [ord(y) if y in string.lowercase else ord(y.lower()) - 0.5 for y in x])
    print(newwords)
    

    输出:

    ['Act', 'about', 'across', 'Bad', 'Bag', 'back', 'ball', 'Card', 'camera', 'canvas', 'danger', 'dark', 'East', 'early', 'edge']
    

    【讨论】:

    • @Reman 抱歉花了这么长时间。在 Python3 中,您应该改用 ascii_lowercase
    • 我正在使用lambda 函数作为键对其进行排序。给lambda 函数一个字符串,并返回可用于将字符串放在正确位置的内容。它返回字符串中每个字母的序号版本列表。例如,给定“字符串”,它会给出[115, 116, 114, 105, 110, 103],但只有当字母是小写时才会给出序数。否则,它给出序数负 0.5。这样,大写字母比小写字母早于 的一半。使B 早于b 就足够了,但不足以使其早于a
    • 是的,那行得通。抱歉耽搁了。今天是我姐姐的生日。
    • 不过,您实际上并不需要它。您可以使用sorted(r),默认情况下它会这样排序。
    • 我想出了一个更好的。即使单词中间有大写字母,这个仍然可以工作:sorted(r, key=lambda s: [(ord(c.lower()) + ((not c.isupper()) / 2.)) for c in s])。你也不需要导入string
    【解决方案2】:

    这个命令会做:

    LC_ALL=C sort -k 1.1f,1.1 PATH
    

    PATH 是您的文件路径。

    解释:

    • sort 排序顺序受当前语言环境影响,因此LC_ALL=C 用于将语言环境设置为已知值(POSIX 语言环境,排序顺序基于 ASCII 字符代码值)
    • -k 1.1f,1.1 告诉 sort 以不区分大小写的方式使用第一个字符作为主排序键
    • 将通过再次比较所有字符来解决主键的相等比较问题(这次以区分大小写的方式)。

    输出与问题中的要求完全相同。

    【讨论】:

    • 实际上,相等的比较是使用所有字符来解决的。这就是大写在小写之前排序的方式(在 LC_ALL=C 下),即使主键不区分大小写。
    • @Jeff Y:不是 100% 确定它是根据语言环境整理主键还是再次解析与整个字段(即包括主键)的相等比较。不管怎样,结果都是一样的。
    • 如果你明确“后续字符”键,你可以看到主键没有被整理:LC_ALL=C sort -k 1.1f,1.1 -k 1.2 TextFile
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多