正则表达式 – 如何删除冗余字段并合并结果行
我正在尝试处理纯文本文件.它基本上是一个名称和相关数字字段的索引,格式如下:
我想对此进行处理
正如您所看到的,这些行并不是一致的:有些可能是空格,有些是新行,有些则是逗号.实际上,我需要合并以重复的全名开头的行,在合并和保留数字字段的数字顺序时丢弃冗余名称条目. 我的直觉告诉我要学习一些快速的perl或awk,但我的技能组合对于两者都是空的.我调查了两者,经过一些搜索和阅读后,我们找不到一条清晰或干净的解决方案. 因此,我的问题是:什么是我可能有效学习并且足以完成这项任务的最佳工具?另外,根据建议的工具,是否有任何关于如何解决问题的建议? 当然,我可以手动编辑这个文件,但这不是很有趣,而且似乎是一个非常愚蠢的,对这个问题很有帮助的方法.我正在以此任务为借口,学习一些关于文本处理的内容,因为它感觉像是一个问题,可能是一个好的,现有的工具. 有什么指针吗? 解决方法
正如Brian所说,使用哈希表.下面删除换行符,在逗号上拆分每个记录,使用“姓氏,名字”原始形式作为哈希的键,将剩余的值推送到数组中,并使用对所述数组的引用作为上述键的值.
然后它只是迭代哈希中的键/值对并相应地格式化. 修改后的解决方案 – 排序数字,省略中间名称和排序输出 #!/usr/bin/env perl use strict; use warnings; my %merged; while (my $record = <DATA>) { chomp $record; my ($lname,$fname,@stuff) = split /[,]+/,$record; push @{ $merged{"$lname,$fname"} },grep { m/^d+$/; } @stuff; } foreach my $name (sort keys %merged) { print $name,",join( ',',sort { $a <=> $b } @{$merged{$name}}),"n"; } __DATA__ Nowosielski,777 Nowosielski,1151 Nunes,116 Nussbaum,Nussbaum,156 Nowosielski,Kimball,485,684,277 修改后的产出 Nowosielski,277,1221 原始解决方案 #!/usr/bin/env perl use strict; use warnings; my %merged; while (my $record = <DATA>) { chomp $record; my ($lname,@stuff) = split /,/,$record; push @{ $merged{"$lname,@stuff; } while (my ($name,$stuff) = each %merged) { print $name,@$stuff),"n"; } __DATA__ Nowosielski,156 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |