regex - 如何删除冗余字段并合并结果行

标签 regex perl sorting sed awk

我正在尝试处理纯文本文件。它基本上是名称和相关数字字段的索引,格式如下:

Nowosielski, Matthew, 484, 584, 777
Nowosielski, Matthew, 1151
Nunes, Paulino, 116
Nussbaum, Mike, 1221, 444,
Nussbaum, Mike, 156

我想处理成这个

Nowosielski, Matthew, 484, 584, 777, 1151
Nunes, Paulino, 116
Nussbaum, Mike, 156, 444, 1221

如您所见,行的结尾并不一致:有些可能是空格,有些是换行符,有些是逗号。实际上,我需要合并以重复的全名开头的行,丢弃多余的名称条目,同时合并并保留数字字段的数字顺序。

我的直觉告诉我要么学习一些快速的 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, Matthew, 484, 584, 777
Nowosielski, Matthew, 1151
Nunes, Paulino, 116
Nussbaum, Mike, 1221, 444,
Nussbaum, Mike, 156
Nowosielski, Matthew, Kimball, 485, 684, 277

修改后的输出

Nowosielski, Matthew, 277, 484, 485, 584, 684, 777, 1151
Nunes, Paulino, 116
Nussbaum, Mike, 156, 444, 1221

原解

#!/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"} }, @stuff;
}

while (my ($name, $stuff) = each %merged) {
    print $name, join( ',', @$stuff), "\n"; 
}

__DATA__
Nowosielski, Matthew, 484, 584, 777
Nowosielski, Matthew, 1151
Nunes, Paulino, 116
Nussbaum, Mike, 1221, 444,
Nussbaum, Mike, 156

关于regex - 如何删除冗余字段并合并结果行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4074471/

相关文章:

regex - 在 Google Analytics 中排除多个 IP 范围

vba - 排序,然后重新排序

json - 字符串化对象时如何从对象中删除引号和反斜杠(不使用正则表达式)

perl - 使用系统时向家长传播信号

regex - 为什么非捕获组(?:) seem to not be working?

perl - UNIVERSAL 不导出任何东西

c# - 如何在不加载到内存的情况下对大型 csv 文件进行排序

javascript - MongoDB $sort 聚合

javascript - 哪些 Javascript 正则表达式特性是 Javascript 独有的?

regex - 匹配字符串之间的所有 (+) 符号