删除两个句子对齐文件中的重复行,Linux

时间:2016-07-07 12:31:21

标签: linux bash awk sed duplicates

我有两个文件中的并行语料库(一个用德语,另一个用英语),句子对齐。这意味着在文件的每一行上,另一个文件中的同一行包含其转义。

然而,在德语语料库中,有些句子仍然是英语(或者它们只是奇怪的标签),例如:

file.en, line 500: The house is small    file.de, line 500: Das Haus ist klein
file.en, line 501: The cat is big        file.de, line 501: The cat is big
file.en, line 444: EMEA/CVMP/424/01      file.de, line 444: EMEA/CVMP/424/01

由于我需要保留句子的顺序,我想检测这些重复项(string1 == string2)并从两个文件中删除它们,以便之后句子仍然对齐。

我见过awk的一些解决方案,但没有一个与我的问题相符。

有什么想法吗?

注意:文件数百万行。

3 个答案:

答案 0 :(得分:3)

你可以使用一个小的perl脚本,除了内存中的直接行之外,它不需要存储任何东西。

只是逐行比较两个文件,只打印不同的文件。

use warnings;
use strict;


open(my $fh1,'<','file');
open(my $fh2,'<','file2');
open(my $fh3,'>','outfile');
open(my $fh4,'>','outfile2');

while (my $line  = <$fh1>){
        my $line2 = <$fh2> ;
        if($line ne $line2){
                print $fh3 $line;
                print $fh4 $line2;
        }
}

用作

perl script.pl

答案 1 :(得分:3)

刚刚学习awk :)所以这是我的解决方案:

paste file.en file.de -d@ | awk 'BEGIN{FS="@";}{if ($1 != $2) {print $1 > "file.en_fixed"; print $2 > "file.de_fixed";}}'

测试它并且它有效。

更短的版本,感谢123:

paste file.en file.de -d@ | awk 'BEGIN{FS="@";}$1 != $2{print $1 > "file.en_fixed"; print $2 > "file.de_fixed";}'

答案 2 :(得分:1)

您可以使用Python轻松完成:

f = open('input_file', 'r')
out = open('out_file', 'w')
for line in f.readlines():                                                      
    x = line.split('file')[1].split(':')[-1].split()
    y = line.split('file')[-1].split(':')[-1].split()

    if x != y:      
        out.write(line)