искать и находить позицию в большом текстовом файле - PullRequest
1 голос
/ 13 декабря 2011

Я хочу найти позицию в большом текстовом файле (187 ГБ) в дистрибутиве Linux

Каждая запись в txt-файле ограничена $$$$, и я хочу найти запись 3396 в файле. Поэтому мне нужно посчитать $$$$, а затем, когда он достигнет 3396.

как я могу решить?

Greetz


хорошо, я приведу пример

TEXT
TEXT

TEXT
TEXT
<TAG>TEXT>

<TAG>
TEXT
TEXT
</TEXT>
$$$$

Так что мои записи выглядят как в файле. Между ними может быть любой символ. После $$$$ начинается следующий netry в новой строке.

Теперь мой вопрос снова. Я хочу определить номер строки 3396-счетчика ограничителя энтри

EDIT:

У меня есть решение:

grep -m 3396 -n '$$$$' FILE

Дает мне номера строк до 3396 отсчетов в $$$$. Последний из них - моя линия интересов

Ответы [ 5 ]

1 голос
/ 13 декабря 2011

Трудно ответить правильно без каких-либо примеров данных, но вы можете попробовать следующее awk one-liner, чтобы увидеть, работает ли оно.

awk '{for(i=1;i<=NF;i++) {if ($i=="$$$$") count++; if ($i=="$$$$" && count==3396) print $(i+1);}}' INPUT_FILE
0 голосов
/ 13 декабря 2011

Несколько более простая команда awk:

awk '/\$\$\$\$/ { if (++count == 3396) { print; exit } }'

Вы можете изменить exit на newfile, если хотите сделать это для нескольких файлов.

Предполагая, что вы хотитевыведите 3396-ю строку, содержащую $$$$;в противном случае, что вы хотите сделать, когда найдете это?

0 голосов
/ 13 декабря 2011

Это может сработать для вас (это утомительно, но способ замедлить такой большой файл!):

for x in {1..4000} ; do echo -e '$$$$\n'$x ; done |
sed -n '/$$$$/{x;s/^/x/;ta;:a;s/x/&/3396;tb;x;b;:b;x;p;:c;n;p;/$$$$/!bc;q}'       
$$$$
3396
$$$$
0 голосов
/ 13 декабря 2011

Так же, как упоминалось в более раннем плакате об использовании лучшего языка в пользу неловко древнего awk, вот вариант Perl, который также short . Чтобы пропустить 3395 пунктов и напечатать 3396-й, используйте

perl -e '$/=q/$$$$/;<>while$.<3395;print$_=<>' <foo.txt
0 голосов
/ 13 декабря 2011

Я думаю, что лучше использовать Python (или другой язык).

Взгляните на http://docs.python.org/library/re.html#re.finditer

Имеет ли текст между знаками доллара фиксированную длину? Если да, вы можете использовать seek () для быстрого перехода к нужной части.

...