2015-03-25 3 views
2

Я пытаюсь написать сценарий Perl/AWK для сравнения вывода двух файлов в этом формате ниже:Использование сценария Perl для сравнения двух файлов

(В настоящее время я могу diff два файла с помощью grep -Fxvf file1 file2 > file3 что недостаточно.)

Примечание: file1 является надмножеством файла2.

file1:

aaaa 
bbbb 
cccc 
dddd 

file2:

bbbb 
cccc 

Ожидаемый результат файла:

aaaa No 
bbbb yes 
cccc yes 
dddd No 
+1

Является ли 'file2' гарантией быть подмножеством' file1'? Если нет, каков ожидаемый вывод для строк, которые появляются в 'file2', но не в' file1'? – Wintermute

+0

Да, file2 может быть подмножеством file1 – Ram

+0

Почему вы не используете 'diff'? – choroba

ответ

0

С AWK:

awk 'NR == FNR { a[$0]; next } { print $0, ($0 in a ? "yes" : "no") }' file2 file1 

То есть:

NR == FNR {        # while processing the first file 
    a[$0]         # (i.e., file2) just remember what you 
    next         # saw, and don't do anything else 
} 
{          # afterwards: 
    print $0, ($0 in a ? "yes" : "no") # print the line followed by "yes" or 
             # "no" depending on whether the line 
             # was seen before in file2 
} 
+0

Получение вывода, как это: (это почти близко, кажется, первый символ после каждого эту директиву да/нет) ноа да NOC кивок – Ram

+0

Я не могу видеть, что ваш фактический выход из комментария. Можете ли вы опубликовать его снова с помощью '\ n' вместо строк новой строки, чтобы я мог видеть, где начинаются и заканчиваются строки? – Wintermute

+0

noa \ n yes \ n noc \ n nod \ n – Ram

2

В Perl'е

use strict; 
use warnings; 

open (my $file_2,"<", "file2.txt") or die $!; 
my %seen; 
while (my $line = <$file_2>) { 
    chomp ($line) ; 
    $seen{$line}++; 
} 

close ($file_2); 

open (my $file_1, "<", "file1.txt") or die $!; 
while (my $line1 = <$file_1>) { 
    chomp $line1; 
    print $line1, " ", $seen{$line1} ? "yes" : "no", "\n"; 
} 
close ($file_1); 

Печать:

aaaa no 
    bbbb yes 
    cccc yes 
    dddd no 

Вы можете применить регулярное выражение, чтобы убрать пробелы, такие как $line =~ s/^\s+//g;, но я не был уверен, если пробел в начале строки был форматированием, дополнением или действительно важным, поэтому я не касался его.

+1

Вы проверили это? Я получаю вывод 'no no'. – serenesat

+0

Незначительная опечатка. Измененный. – Sobrique

Смежные вопросы