У меня есть два текстовых файла. Один файл с некоторыми данными, например

 hi 
 how

И еще один файл вроде

L_ hello hi whats up
 N_ david
 N_ jhon
 N_ abraham
 N_ mc D  
L_ hey how u doing
 N_ david
 N_ jhon
 N_ abraham
 N_ mc D
L_ some blah blah blah
 N_ david
 N_ jhon
 N_ abraham
 N_ mc D

Как я могу взять строку из первого файла и проверить наличие этой строки в другом файле?

Если строка присутствует (например, hi в моем примере), мне нужно напечатать только эту строку поиска и имена чуть ниже этой строки. Рассмотрим L_ - это некоторый идентификатор для строки, где мы проверяем строку, присутствует ли строка в этой строке. Я хочу напечатать имя чуть ниже этой строки с идентификатором N_, а не другие, при печати идентификаторы L_ и N_ следует удалить.

Я ищу совета, как решить эту проблему с помощью Perl.

0
Naidu 11 Апр 2014 в 16:09

3 ответа

Лучший ответ

Попробуй это:

#!/usr/bin/perl

use strict;
use warnings;

open my $patterns, '<', "$ARGV[0]"
    or die "Cannot open $ARGV[0]:$!";
open my $data, '<', "$ARGV[1]"
    or die "Cannot open $ARGV[1]:$!";

my @patterns;
while (<$patterns>) {
    chomp;
    push @patterns, $_;
}

my $line;
LINE: while ($line = <$data>) {
    chomp $line;
    if ($line =~ m/^\s*L_/) {
        foreach my $pat (@patterns) {
            if ($line =~ m/$pat/) {
                print "$line\n";
                while ($line = <$data>) {
                    if ($line =~ m/^\s*N_/) {
                        print $line;
                    }
                    else {
                        redo LINE;
                    }
                }
            }
        }
    }
}
0
Lee Duhem 11 Апр 2014 в 12:56
perl -ne'
  BEGIN{
  $x = pop;
  ($re) = map qr/$_/, join "|", map /(\w+)/ && qr/\Q$1/, <>;
  @ARGV = $x;
  }
  $b = /($re)/ and print("\n$1"),next if /^L_/;
  chomp; s/^\w+_//;
  print if $b
' file1 file2

Выход

hi david jhon abraham mc D
how david jhon abraham mc D
1
mpapec 11 Апр 2014 в 13:16

Вы, вероятно, захотите посмотреть на функции perl open и grep.

    my $datafile = "some_data_file.txt";
    my $comparefile = "data_to_compare.txt";
    open ( my $data_filehandle, "<", $datafile ) or die $!;
    my @things_to_find = <$data_filehandle>;

    open ( my $compare_filehandle, "<", $comparefile ) or die $!;
    while ( my $line = <$compare_filehandle> ) 
    {
       foreach my $thing ( @things_to_find )
       {
          print "Match found with: $line" if $line =~ m/$thing/;
          print "Next line is :", <$compare_filehandle>;
       }
    }

Это вытянет строки, соответствующие шаблону, а затем напечатает следующую строку. Я предоставлю вам разобраться в деталях разбора каждой строки. В этом вам поможет документация по Perl на perlre.

0
Sobrique 11 Апр 2014 в 13:02