我有一个如下所示的文件:
foo03a
foo02b
quux01a
foo01a
foo02a
foo01b
foo03b
quux01b
我希望它按最后一个字符(soa
和b
一起出现)排序,然后按前面的数字排序,然后按前缀排序(尽管这不是必需的)。从而导致:
foo01a
quux01a
foo02a
foo03a
foo01b
quux01b
foo02b
foo03b
quux01a
实际上,出现在哪里并不特别重要quux01b
,只要它们位于相关组中即可 - 它们可以如图所示、 beforefoo01b
或 after出现foo03b
。
为什么?这些是蓝/绿部署中使用的服务器名称,因此我希望将“A”服务器放在一起,然后将“B”服务器放在一起。
我发现-k
切换到 GNU 排序,但我不明白如何使用它来指定特定字符,从字符串末尾开始计数。
我尝试过cat foos | rev | sort | rev
,但是foo10a
(foo10b
当我们数到那么远时)到了错误的地方。
答案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。
运行它sort
,cut
找到我想要的字段。完毕。
答案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