Как найти шаблон и окружающий контент в очень большом файле строки? - PullRequest
5 голосов
/ 03 октября 2011

У меня есть очень большой файл 100Mb +, где весь контент находится в одной строке.Я хочу найти шаблон в этом файле и количество символов вокруг него.

Например, я хотел бы вызвать команду, подобную приведенной ниже, но где -A и -B - количество байтов, а не строк.:

cat very_large_file | grep -A 100 -B 100 somepattern

Итак, для файла, содержащего содержимое, подобное этому:

1234567890abcdefghijklmnopqrstuvwxyz

С шаблоном

890abc
and a before size of -B 3 
and an after size of -A 3

Я хочу вернуть:

567890abcdef

Любые советы будут великолепны.Большое спасибо.

Ответы [ 3 ]

11 голосов
/ 03 октября 2011

Вы можете попробовать опцию -o:

-o, --only-matching
      Show only the part of a matching line that matches PATTERN.

и использовать регулярное выражение для сопоставления с вашим шаблоном и 3 предыдущими / следующими символами, т.е.дал, это было бы

echo "1234567890abcdefghijklmnopqrstuvwxyz" > tmp.txt
grep -o -P ".{3}890abc.{3}" tmp.txt
4 голосов
/ 03 октября 2011

Еще один с sed (он может понадобиться в системах, где GNU grep недоступен):

sed -n '
  s/.*\(...890abc...\).*/\1/p
  ' infile
3 голосов
/ 03 октября 2011

Лучший способ сделать это с помощью крошечного Perl-скрипта.

#!/usr/bin/perl
$pattern = $ARGV[0];
$before = $ARGV[1];
$after = $ARGV[2];

while(<>) {
  print $& if( /.{$before}$pattern.{$after}/ );
}

Вы бы тогда выполнили это так:

cat very_large_file | ./myPerlScript.pl 890abc 3 3

РЕДАКТИРОВАТЬ: Черт, решение Паоло гораздо проще. Ну да ладно, Вива ля Перл!

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