首页 > 解决方案 > 删除词汇表源列中的重复项,同时合并目标列中的不同含义

问题描述

我一直在寻找一个正则表达式来完成一项任务,所以请帮忙,我相信你可以用一个很好的解决方案来摇滚。我建立词汇表,有时我会得到重复的源术语,它们完全相同,但目标不同。请参见下面的示例:

Absolute potential  الجهد المطلق
Absolute potential  جهد مطلق
Absolute potential  جهد مطلقفرق الجهد المطلق بين الفلز والمحلول
**Absolute power    سلطة استبدادية
Absolute power  سلطة مطلقة
Absolute power  قدرة مطلقة**
Absolute power consumption  استهلاك الطاقة الفعلي
Absolute pressure   الضغط المطلق
Absolute prices أسعار مطلقة
Absolute priority   أولوية مطلقة
Absolute priority   الأولوية المُطلقة
Absolute priority   اولوية / اسبقية

这些是制表符分隔的文件。我正在寻找一种方法来查找任何重复的源术语,例如绝对力量,因为它在所有 3 行中都是相同的,并且只用一个条目替换,只有一个绝对力量,同时将所有目标含义合并和分离通过管道字符。所以条目看起来像这样:

**Absolute power    سلطة استبدادية | سلطة مطلقة | قدرة مطلقة**

所以我正在寻找一个正则表达式来自动完成这项任务。因此,在整个大型词汇表文本文件中,一个术语,后跟一个制表符,然后是由管道字符分隔的合并阿拉伯语条目。那真的会让我很开心。真诚的,山姆

标签: perl

解决方案


glossary.txt这是一个假设输入文件是 UTF8 编码的示例,说明如何使用脚本来执行此操作:

use feature qw(say);
use strict;
use warnings;
use open qw(:std IN :encoding(utf-8) OUT :utf8); 

my $fn = 'glossary.txt';
open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
my %target;
my @order;
while( my $line = <$fh> ) {
    chomp $line;
    my ($subject, $target) = split "\t", $line;
    if (exists $target{$subject}) {
        push @{ $target{$subject} }, $target;
    }
    else {
        $target{$subject} = [ $target ];
        push @order, $subject;
    }
}
close $fh;

for my $subject (@order) {
    say $subject . "\t" . join " | ", @{$target{$subject}};
}

推荐阅读