Как я могу grep и сортировать текстовые файлы, используя Perl? - PullRequest
4 голосов
/ 24 сентября 2010

У меня есть простой файл журнала, который очень грязный, и мне нужно, чтобы он был аккуратным. Файл содержит заголовки журналов, но все они перемешаны вместе. Поэтому мне нужно отсортировать файлы журнала в соответствии с заголовками журнала. Статического количества строк нет - это означает, что для каждого заголовка текстового файла не существует фиксированного количества строк. И я использую perl grep для сортировки заголовков.

Файлы журнала выглядят примерно так:

Car LogFile Header
<text>
<text>
<text>
Car LogFile Header
<text>
Car LogFile Header
<and so forth>

Я разработал / искал простой алгоритм, но, похоже, он не работает. Может кто-нибудь, пожалуйста, направить меня? Спасибо!

#!/usr/bin/perl

#use 5.010; # must be present to import the new 5.10 functions, notice 
#that it is 5.010 not 5.10


my $srce = "./root/Desktop/logs/Default.log";
my $string1 = "Car LogFile Header";
open(FH, $srce);
my @buf = <FH>;
close(FH);
my @lines = grep (/$string1/, @buffer);

После выполнения кода результат не отображается на терминале. Есть идеи?

Ответы [ 6 ]

10 голосов
/ 24 сентября 2010

Я думаю, вы хотите что-то вроде:

 my $srce = "./root/Desktop/logs/Default.log";
 my $string1 = "Car LogFile Header";

 open my $fh, '<',  $srce or die "Could not open $srce: $!";

 my @lines = sort grep /\Q$string1/, <$fh>;
 print @lines;

Убедитесь, что у вас правильный путь к файлу и что в файле есть строки, соответствующие вашему тестовому шаблону.

Кажется, что вам не хватает многих базовых понятий и, возможно, вырезания и вставки кода, который вы видите в другом месте. Если вы только начинаете, выберите учебник по Perl, например Learning Perl . Есть другие книги и справочники, перечисленные в perlfaq2 .

2 голосов
/ 24 сентября 2010

Всегда используйте:

use strict;
use warnings;

Это могло бы сказать вам, что @buffer не определено.

#!/usr/bin/perl

use strict;
use warnings;

my $srce = "./root/Desktop/logs/Default.log";
my $string1 = "Car LogFile Header";
open(my $FH, $srce) or die "Failed to open file $srce ($!)";
my @buf = <$FH>;
close($FH);
my @lines = grep (/$string1/, @buf);
print @lines;

Perl сложно для экспертов, поэтому эксперты используют предупреждения, которые он предоставляетзащитить их от ошибок.Начинающим нужно использовать предупреждения, чтобы они не совершали ошибок, о которых они даже не подозревают, что могут совершить.

(Поскольку у вас не было возможности chomp ввести строки, у вас все еще есть переводы строкив конце print печатает заголовки по одному на строку.)

1 голос
/ 03 ноября 2011

Я не думаю, что grep - это то, что вы действительно хотите. Как вы указали в ответе Брайана, grep выдаст вам только заголовки, а не последующие строки.

Я думаю, вам нужен массив, в котором каждый элемент является заголовком, а последующие строки - до следующего заголовка.

Что-то вроде: -

#!/usr/bin/perl

use strict;
use warnings;

my $srce = "./default.log";
my $string1 = "Car LogFile Header";
my @logs;
my $log_entry;
open(my $FH, $srce) or die "Failed to open file $srce ($!)";

my $found = 0;
while(my $buf = <$FH>)
{
    if($buf =~ /$string1/)
    {
        if($found)
        {
            push @logs, $log_entry;
        }

        $found = 1;
        $log_entry = $buf;
    }
    else
    {
        $log_entry = $log_entry . $buf; 
    }
}

if($found)
{
    push @logs, $log_entry;
}

close($FH);

print sort @logs;

Я думаю, это то, о чем просят.

0 голосов
/ 14 марта 2013

Здравствуйте, я нашел способ извлечь ссылки из HTML-файла

! / Usr / bin / perl -w

  2 
  3 # Links graber 1.0
  2 
  3 # Links graber 1.0
  4 #Author : peacengell
  5 #28.02.13
  6 
  7 ####
  8 
  9 my $file_links = "links.txt";
 10 my @line;
 11 my $line;
 12 
 13 
 14 open( FILE, $file_links ) or die "Can't find File";
 15 
 16 while (<FILE>) {
 17 chomp;
 18 $line = $_ ;
 19 
 20 @word = split (/\s+/, $line);
 21 @word  = grep(/href/, @word);
 22 foreach  $x (@word) {
 23 
 24 if ( $x =~ m /ul.to/ ){
 25 $x=~ s/href="//g;
 26 $x=~s/"//g;
 27 print  "$x \n";
 28 
 29                         
 30                         }
 31                 
 32                 }
 33         
 34         }

вы можете использовать его и изменить его, пожалуйста, дайте мне знать, еслиВы модифицируете это.

0 голосов
/ 24 сентября 2010

Вы просто сохранили все в массиве вместо того, чтобы распечатать его.Также нет необходимости хранить весь файл в памяти.Вы можете прочитать и распечатать результаты матча построчно, например:

my $srce = "./root/Desktop/logs/Default.log";
my $string1 = "Car LogFile Header";
open(FH, $srce);
while(my $line = <FH>) { 
  if($line =~ m/$string1/) {
    print $line;
  }
}
close FH;
0 голосов
/ 24 сентября 2010

Perl grep - это не то же самое, что команда Unix grep, поскольку она ничего не печатает на экране.

Общий синтаксис: grep Expr, LIST

Оценивает Expr для каждого элемента LIST и возвращает список, состоящий из тех элементов, для которых выражение оценивается как true.

В вашем случае будут возвращены все элементы @buffer, имеющие значение $string1.

Затем вы можете распечатать массив @buffer, чтобы увидеть их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...