如何遍历行并将增量数字附加到重复项?
How to Iterate through rows and append incremental number to duplicates?
我有一个包含数百个自动缩放服务器和每隔几分钟生成一次服务器主机文件的环境,每台服务器一行 3 列:
例如
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 或启动或终止时的任何问题。他们很少访问,但如果是通过跳转箱访问,只希望该服务器始终具有正确的主机信息和短标记名称以便于连接
总是单数的服务器,在它们的末尾有一个数字。没有编号的服务器一直在放大和缩小,这些是有问题的,因为它们都被标记为相同的名称。
需要对行进行排序,然后忽略以数字结尾的任何行,对于第 3 列没有数字且有重复结果的任何其他行,它们需要增加一个数字并附加到末尾。
例如。最终结果:
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
看看这个:
$ 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
$
我有一个包含数百个自动缩放服务器和每隔几分钟生成一次服务器主机文件的环境,每台服务器一行 3 列:
例如
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 或启动或终止时的任何问题。他们很少访问,但如果是通过跳转箱访问,只希望该服务器始终具有正确的主机信息和短标记名称以便于连接
总是单数的服务器,在它们的末尾有一个数字。没有编号的服务器一直在放大和缩小,这些是有问题的,因为它们都被标记为相同的名称。
需要对行进行排序,然后忽略以数字结尾的任何行,对于第 3 列没有数字且有重复结果的任何其他行,它们需要增加一个数字并附加到末尾。
例如。最终结果:
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
看看这个:
$ 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
$