解析和重新排列主机名
parse and rearrange hostnames
下面是存储在文本文件中的主机名列表。
web1.maxi.com
web3.maxi.com
web4.maxi.com
web5.maxi.com
web6.maxi.com
web7.maxi.com
web8.maxi.com
web9.maxi.com
web11.maxi.com
为了快速显示它,它需要被解析并重写/显示为
web[1,3-9,11].maxi.com
你们能帮我吗,任何建议都会有所帮助。
使用 perl,您可以使用 Set::IntSpan
模块来压缩数字序列。
以下解决方案可以处理混合和无序的网站列表。
在文件中
web3.maxi.com
web4.maxi.com
web5.maxi.com
mail1.mexi.com
web6.maxi.com
web9.maxi.com
web9.maxi.com
web11.maxi.com
mail3.mexi.com
web7.maxi.com
mail4.mexi.com
mail25.mexi.com
mail26.mexi.com
mail27.mexi.com
mail28.mexi.com
web8.maxi.com
mail29.mexi.com
mail110.mexi.com
web1.maxi.com
parse.pl
#!/usr/bin/perl -l
use Set::IntSpan;
use File::Slurp qw/slurp/;
$str = slurp(*STDIN);
# Remove redundant whitespace
chop $str;
$str =~ s/^[t ]+|[t ]+$//gm;
$str =~ s/R+/n/g;
# Copy $str so we can match numbers in it without disturbing the loop
$nums = $str;
# Parse lines in $str in sequence
while($str =~ /^(.*)$/gm) {
$line = $1;
# Extract bits before and after number
($pre, $post) = $line =~ /([^d]+)d+(.*)$/m;
# Check if its been printed already
next if $seen{$pre . $post};
# If not, extract numbers
@numbers = $nums =~ /$pre(d+)$post/g;
print $pre . "["
. Set::IntSpan->new(@numbers)->run_list()
. "]" . $post;
$seen{$pre . $post} = 1;
}
像这样运行它:
perl parse.pl < infile
输出:
web[1,3-9,11].maxi.com
mail[1,3-4,25-29,110].mexi.com
可能神秘@numbers = $nums =~ /$pre(d+)$post/g
扩展到与正则表达式匹配的项目数组,并将其保存在 @numbers
中。
请注意,此解决方案将整个文件加载到内存中。
with open("data.txt") as f:
sites=[x.strip() for x in f]
ranges=[]
for x in sites:
x=x.split(".")
num=int(x[0][x[0].index("web")+3:])
if ranges:
if num-ranges[-1][-1]==1:
ranges[-1].append(num)
else:
ranges.append([num])
else:
ranges.append([num])
print ranges
print "web["+",".join(str(x[0]) if len(x)==1 else str(x[0])+"-"+str(x[-1]) for x in ranges)+"].maxi.com"
输出:
[[1], [3, 4, 5, 6, 7, 8, 9], [11]]
web[1,3-9,11].maxi.com
我的看法:
#print hosts
lines = open("log.txt").readlines()
numbers = [int(line.split(".")[0][3:]) for line in lines]
out = [[]]
index = 0
for i in xrange(len(numbers) - 1):
out[index].append(numbers[i])
if (numbers[i + 1] - numbers[i] != 1):
out.append( [] )
index += 1
out[-1].append(numbers[-1])
strings = [str(number[0]) if len(number) == 1 else str(number[0]) + "-" + str(number[-1]) for number in out]
print ",".join(strings)
最好将循环更改为更具 pythonic/功能 的东西。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么不;名字在地图上是按顺序排列的吗
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 找到具有最多子串栅栏的字符串排列
- 重新排列单线以形成闭合多边形?
- 如何停止 CLR 主机?
- 如何强制 Thrift 仅接受来自本地主机的连接
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 输入的 C++ 排列
- 公共/私有/受保护是否会更改内存中结构的排列?
- 如何在 C/C++ 中生成具有 n 组 5 个值(重复项)的所有可能排列的矩阵
- 在向量C++中排列奇数和偶数
- 库达如何将字符**从内核复制到主机
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- 如何进行排列?
- 矩阵行求和与 RowMajor 和 ColMajor 数据排列的奇怪性能差异
- 解析和重新排列主机名