Если я вас правильно понимаю:
- Файл № 1 и файл № 2 будут иметь одинаковые строки
- Однако некоторые строки будут отсутствовать в файле № 2, который находится вfile # 1.
- И, самое главное, строки будут отсортированы в каждом файле.
Это означает, что если я получу строку из файла # 2, и продолжу читать черезфайл # 1, я найду подходящую строку рано или поздно.Поэтому мы хотим прочитать строку из файла № 2, продолжаем просматривать файл № 1, пока не найдем подходящую строку, а когда мы ее найдем, мы хотим распечатать оба значения.
Я бы мог представитькакой-то алгоритм вроде этого:
Read first line from file #2
While read line from file #1
if line from file #2 > line from file #1
write line from file #1 and "NA"
else
write line from file #1 and file #2
Read another line from file #2
fi
done
Должна быть какая-то форма проверки ошибок (что если вы обнаружите, что строка из файла # 1 больше, чем строка из файла # 2? Это означает, что строка #1 пропускает строку.) И, должна быть некоторая проверка границ (что, если у вас закончатся строки из файла # 2, прежде чем вы закончите файл # 1?)
Это звучит как школьное задание, поэтому ядействительно не хочу давать фактический ответ.Тем не менее, алгоритм есть.Все, что вам нужно сделать, это реализовать его на вашем любимом языке.
Если это не школьное задание, и вам нужна дополнительная помощь, просто оставьте комментарий к этому ответу, и я сделаю все, что могу.
Биологу ДНК
#! /usr/bin/env perl
use warnings;
use strict;
use feature qw(say);
use constant {
TEXT1 => "foo1.txt",
TEXT2 => "foo2.txt",
};
open (FILE1, "<", TEXT1) or die qq(Can't open file ) . TEXT1 . qq(for reading\n);
open (FILE2, "<", TEXT2) or die qq(Can't open file ) . TEXT2 . qq(for reading\n);
my $line2 = <FILE2>;
chomp $line2;
my ($lineNum2, $value2) = split(/\s+/, $line2, 2);
while (my $line1 = <FILE1>) {
chomp $line1;
my ($lineNum1, $value1) = split(/\s+/, $line1, 2);
if (not defined $line2) {
say "$lineNum1 - $value1 - NA";
}
elsif ($lineNum1 lt $lineNum2) { #Use "<" if numeric match and not string match
say "$lineNum1 - $value1 - NA";
}
elsif ($lineNum1 eq $lineNum2) {
say "$lineNum1 - $value1 - $value2";
$line2 = <FILE2>;
if (defined $line2) {
chomp $line2;
($lineNum2, $value2) = split(/\s+/, $line2, 2);
}
}
else {
die qq(Something went wrong: Line 1 = "$line1" Line 2 = "$line2"\n);
}
}
Он не был тщательно протестирован, но работал с некоторыми короткими файлами примеров.