Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 组相似的主机名并添加计数器_Bash_Scripting - Fatal编程技术网

Bash 组相似的主机名并添加计数器

Bash 组相似的主机名并添加计数器,bash,scripting,Bash,Scripting,所以,我有一个问题,我不知道如何解决它 我有一个类似的主机名列表,但有细微的差异。例如: hostname1000 hostname1001 hostname1002 hostname1003 hostname1004 hostname2000 hostname2001 hostname2002 我想将这些主机名分组如下: hostname[1000-1004,2000-2002] 这将用于pdsh 我尝试了以下方法,但它只是在文件名的末尾添加了一个计数,并且没有按每个主机

所以,我有一个问题,我不知道如何解决它

我有一个类似的主机名列表,但有细微的差异。例如:

 hostname1000
 hostname1001
 hostname1002
 hostname1003
 hostname1004
 hostname2000
 hostname2001
 hostname2002
我想将这些主机名分组如下:

 hostname[1000-1004,2000-2002]
这将用于pdsh

我尝试了以下方法,但它只是在文件名的末尾添加了一个计数,并且没有按每个主机名的uniq计数进行分组

 num=1;for a in $(cat range_hostname |cut -c 1-12 |sort) ; do echo ${a}${num}; num=$[num+1 ];done
任何想法都会有帮助:)

谢谢!
Joe

所以我也在unix.com上发布了这个问题的解决方案,以便其他人可以看到:

 awk '
            {HN = $1
             sub (/[0-9]*$/, _, HN)
             sub (/^[a-z]*/, _, $1)
            }
NR == 1         {printf "%s[%04d-", HN, $1
            }
NR > 1 &&
$1+0 != LAST+1    {printf "%04d,%04d-", LAST, $1
            }
            {LAST = $1
            }
END             {printf "%04d]\n", $1
            }
' filename
filename一次包含一行主机名列表

这还假定主机名后面有一组4位数字,如中所示

hostnmae0101
hostname0102
hostname0103 ... etc
输出将是

hostname[0101-0103]
谢谢!
Joe

所以我也在unix.com上发布了这个问题的解决方案,以便其他人可以看到:

 awk '
            {HN = $1
             sub (/[0-9]*$/, _, HN)
             sub (/^[a-z]*/, _, $1)
            }
NR == 1         {printf "%s[%04d-", HN, $1
            }
NR > 1 &&
$1+0 != LAST+1    {printf "%04d,%04d-", LAST, $1
            }
            {LAST = $1
            }
END             {printf "%04d]\n", $1
            }
' filename
filename一次包含一行主机名列表

这还假定主机名后面有一组4位数字,如中所示

hostnmae0101
hostname0102
hostname0103 ... etc
输出将是

hostname[0101-0103]
谢谢! 乔