2

几天前,我问了一个关于在 2 个文本文件中标记差异的问题,并很快得到了回答。

现在我有一个相当相似的问题,但有点复杂。我有 2 对具有以下特征的文件: pair1: (File1.txt , File2.txt) pair2: (File3.txt , File4.txt)

这些对中的每个文件之间存在逐行对应关系。说 File1.txt 和 File3.txt 是一些英文单词,File2.txt 和 File4.txt 分别是它们的阿拉伯语和法语翻译。此外,File1.txt 和 File3.txt 非常相似(在某些情况下相同)。


    File1.txt       File2.txt
    EnWord1         ArTrans1
    EnWord2         ArTrans2
    EnWord3         ArTrans3
    Enword4         ArTrans4

    File3.txt       File4.txt
    EnWord1         FrTrans1
    EnWord3         FrTrans3
    Enword4         FrTrans4
    Enword5         FrTrans5

现在我要做的是比较这些对的英文面,找到两个文件中出现的共同词(EnWord1、EnWord3 和 EnWord4)并过滤掉它们对应的翻译。简而言之,我可以说使用两个双语英语-阿拉伯语和英语法语词典,我正在尝试构建一个 3 语种英语-阿拉伯语-法语词典。怎么可能?

我必须补充一点,因为有很多这样的对(字典存储在不同的文件中,每个文件都包含一部分单词,并且由于某些原因无法合并文件然后处理它们)代码的速度非常重要,我正在寻找一种快速的方法来做到这一点。

最后,请给我一些要点(甚至可能是完整的代码)在 Perl 中执行此操作。

最好的问候,哈基姆

4

4 回答 4

2

将此视为提示,我尚未验证

join <(paste file.1 file.2) <(paste file.3 file.4)
于 2012-06-21T10:19:50.490 回答
1

我假设您要维护的顺序如下File1.txt。以下perl应该完成您正在寻找的内容:

#!/usr/bin/perl

use strict;
use warnings;

my @pair1 = `paste -d ":" $ARGV[0] $ARGV[1]`;
my @pair2 = `paste -d ":" $ARGV[2] $ARGV[3]`;

my @pairs = (@pair1, @pair2);
my (%seen, @dups);

foreach (@pairs)
{
  my $word = (split ":", $_)[0];
  push @dups, $word if $seen{$word}++;
}

open (FILE0, ">", "NEW_File0.txt") or die;
open (FILE1, ">", "NEW_File1.txt") or die;
open (FILE2, ">", "NEW_File2.txt") or die;

foreach my $duplicate (@dups)
{
  print FILE0 "$duplicate\n";

  foreach (@pair1) { print FILE1 ((split ":", $_)[1]) if $_ =~ /^$duplicate:/; }
  foreach (@pair2) { print FILE2 ((split ":", $_)[1]) if $_ =~ /^$duplicate:/; }
}

close FILE0;
close FILE1;
close FILE2;

像这样运行:

./script.pl File1.txt File2.txt File3.txt File4.txt

grep "" NEW_File*结果:

NEW_File0.txt:EnWord1
NEW_File0.txt:EnWord3
NEW_File0.txt:EnWord4
NEW_File1.txt:ArTrans1
NEW_File1.txt:ArTrans3
NEW_File1.txt:ArTrans4
NEW_File2.txt:FrTrans1
NEW_File2.txt:FrTrans2
NEW_File2.txt:FrTrans3

可能不是最有效的做事方式,但至少应该给你一个开始的地方。HTH。

于 2012-06-21T15:18:35.267 回答
0

这将是 Perl 中的粗略代码。

%Dict1 = map { /^(.+),(.+)$/ } `paste file1.txt file2.txt -d,`;
%Dict2 = map { /^(.+),(.+)$/ } `paste file3.txt file4.txt -d,`;

print "Col1,Col2,Col3";
print "$_,$d1{$_},$d2{$_}\n" foreach (keys %k) ;
于 2012-06-21T11:16:12.560 回答
0

我不想合并文件,每种语言都必须在一个单独的文件中,但它们必须是文件之间的 1 对 1 对应关系。根据我在第一篇文章中讨论的示例,完成该过程后,文件的内容必须如下:

File1.txt:
EnWord1         
EnWord3
Enword4

File2.txt:
ArTrans1         
ArTrans3
ArTrans4

File4.txt:
FrTrans1
FrTrans3
FrTrans4

正如我在该示例中所解释的,EnWord1、EnWord3 和 EnWord4 是 File1.txt 和 File3.txt 中常见的英文单词。

中间必须保留的重要一点是 File1 和 File3 都是英文的,它们共享一些单词。我需要首先找到这些文件的公共行并将它们存储在另一个文件中(例如 File5.txt),然后过滤 File2 和 File4,使其仅包含存储在 File5 中的单词的翻译。

于 2012-06-21T11:40:16.550 回答