按输入的最后一个字符排序,然后按前面的数字排序?

按输入的最后一个字符排序,然后按前面的数字排序?

我有一个如下所示的文件:

foo03a
foo02b
quux01a
foo01a
foo02a
foo01b
foo03b
quux01b

我希望它按最后一个字符(soab一起出现)排序,然后按前面的数字排序,然后按前缀排序(尽管这不是必需的)。从而导致:

foo01a
quux01a
foo02a
foo03a
foo01b
quux01b
foo02b
foo03b

quux01a实际上,出现在哪里并不特别重要quux01b,只要它们位于相关组中即可 - 它们可以如图所示、 beforefoo01b或 after出现foo03b

为什么?这些是蓝/绿部署中使用的服务器名称,因此我希望将“A”服务器放在一起,然后将“B”服务器放在一起。

我发现-k切换到 GNU 排序,但我不明白如何使用它来指定特定字符,从字符串末尾开始计数。

我尝试过cat foos | rev | sort | rev,但是foo10afoo10b当我们数到那么远时)到了错误的地方。

答案1

awk我找到了使用 GNU 函数的解决方案match

cat foos | \
  gawk 'match($0, /([^0-9]+)([0-9]+)([^0-9]+)/, a) {print a[3], a[2], $0}' | \
  sort | cut -d' ' -f3

gawk命令使用正则表达式捕获来生成排序键,因此我最终得到以下结果:

a 03 foo03a
b 02 foo02b

...ETC。

运行它sortcut找到我想要的字段。完毕。

答案2

您可以sort通过字段(此处为字段 1)的字符位置(由 后面的数字表示.):

sort -k1.6 -k1.4,1.5n -k1.1,1.3 file.txt 

例子:

$ cat file.txt 
foo03a
foo02b
foo01a
foo02a
foo01b
foo03b

$ sort -k1.6 -k1.4,1.5n -k1.1,1.3 file.txt 
foo01a
foo02a
foo03a
foo01b
foo02b
foo03b

反向方式,使用rev

$ rev file.txt | sort -k1.1,1.1 -k1.2,1.3n -k1.4 | rev
foo01a
foo02a
foo03a
foo01b
foo02b
foo03b

相关内容