如何遍历行并将增量编号追加到重复项?

时间:2018-11-16 05:22:12

标签: bash scripting increment

我有一个数百个自动缩放服务器和服务器主机文件的环境,该环境每隔几分钟生成一次,每个服务器一行三列:

例如

10.10.1.2 video-server-usa-01 vs-usa-01
10.10.1.3 video-server-jap-01 vs-jap-01
10.10.1.4 upload-server upload
10.10.1.5 upload-server upload
10.10.1.6 upload-server upload
10.10.1.7 editing-server edit
10.10.1.8 editing-server edit
10.10.1.9 data-storage-server-01 data-01

此外,该列表是随机且未排序的。

非常简单的环境,所以不要想花哨的自我报告dns或在启动或终止时进行任何操作来解决问题。它们很少被访问,但是如果是通过跳转框访问的,则只是希望该服务器始终具有正确的主机信息和带有短标记的名称,以便于连接

总是单数的

服务器在其末尾有一个数字。没有数字的服务器一直在按比例放大和缩小,而这些都是有问题的,因为它们都被标记了相同的名称。

需要对行进行排序,然后忽略以数字结尾的任何行,而对于第三列没有数字并且结果重复的任何其他行,则需要将数字递增并追加到末尾。

例如最终结果:

10.10.1.2 video-server-usa-01 vs-usa-01
10.10.1.3 video-server-jap-01 vs-jap-01
10.10.1.4 upload-server upload-01
10.10.1.5 upload-server upload-02
10.10.1.6 upload-server upload-03
10.10.1.7 editing-server edit-01
10.10.1.8 editing-server edit-02
10.10.1.9 data-storage-server-01 data-01

1 个答案:

答案 0 :(得分:1)

检查一下:

$ cat genie1.txt
10.10.1.2 video-server-usa-01 vs-usa-01
10.10.1.8 editing-server edit
10.10.1.6 upload-server upload
10.10.1.3 video-server-jap-01 vs-jap-01
10.10.1.4 upload-server upload
10.10.1.5 upload-server upload
10.10.1.9 data-storage-server-01 data-01
10.10.1.7 editing-server edit

$ sort -k2,3 -k1 -n genie1.txt | perl -F"\s+" -lane ' { if( /(.+?)(?<![0-9])$/) {$k="$F[1] $F[2]";$col3{$k}++; printf("%s %s %s-%02d\n",$F[0],$F[1],$F[2],$col3{$k}) }
else {print} } '
10.10.1.2 video-server-usa-01 vs-usa-01
10.10.1.3 video-server-jap-01 vs-jap-01
10.10.1.4 upload-server upload-01
10.10.1.5 upload-server upload-02
10.10.1.6 upload-server upload-03
10.10.1.7 editing-server edit-01
10.10.1.8 editing-server edit-02
10.10.1.9 data-storage-server-01 data-01

$