Bash:通过字节区分大小写的Sort命令或使用python Sort命令对文本文件进行排序

Bash:通过字节区分大小写的Sort命令或使用python Sort命令对文本文件进行排序,python,linux,bash,sorting,case,Python,Linux,Bash,Sorting,Case,文本文件 使用排序-s (区分大小写) 使用sort-f(不区分大小写) 以大写字母开头的单词按字母顺序排列在小写单词之间 我想要的是大写的单词位于下一个字母的开头(按字母顺序排列): 预期产出: Act about across Bad Bag back ball Card camera canvas danger dark East early edge 如何使用bash或python sort命令实现这一点?我成功地做到了!下面是(Python中的): 输出: ['Act', 'abou

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

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

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

我想要的是大写的单词位于下一个字母的开头(按字母顺序排列):
预期产出

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

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

我成功地做到了!下面是(Python中的):

输出:

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

此命令将执行以下操作:

LC_ALL=C sort -k 1.1f,1.1 PATH
其中
PATH
是您的文件路径

说明:

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

输出完全符合问题中的要求。

实际上,使用所有字符可以解决相等的比较问题。这就是大写字母在小写字母之前排序的方式(在LC_ALL=C下),即使主键不区分大小写。@Jeff Y:无法100%确定它是基于区域设置整理主键还是再次解析与整个字段(即包括主键)的相等比较。无论哪种方式,结果都是一样的。如果将“后续字符”键显式设置为:
LC_ALL=C sort-k 1.1f,1.1-k 1.2 TextFile
@Reman很抱歉花了这么长时间。在Python3中,您应该使用
ascii\u小写字母
。我使用
lambda
函数对其进行排序。
lambda
函数被赋予一个字符串,并返回可用于将字符串放置在正确位置的内容。它返回字符串中每个字母的顺序版本列表。例如,给定“string”,它将给出
[115、116、114、105、110、103]
,但只有当字母是小写时,它才会给出序号。否则,它将给出序号减0.5。这样,大写字母比小写字母早半个字母。使
B
早于
B
就足够了,但不足以使
a
早于
a。是的,这样行。抱歉耽搁了。今天是我妹妹的生日,不过你真的不需要。您只需使用排序(r)
,默认情况下它会这样排序。我想出了一个更好的。即使在单词中间有大写字母,这个仍然可以工作:<代码>排序(r,key=lambda s:[(Ord(C.LoReR())+((不C.IUPUBER))/2).c中的S])< /代码>。您也不需要导入
字符串
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']
LC_ALL=C sort -k 1.1f,1.1 PATH