Сегментируйте большой файл по конкретному уникальному слову в строке и удаляйте дубликаты в этих сегментах, используя Python или любой другой язык сценариев.

Я постараюсь добраться до сути. Поэтому я пытаюсь сегментировать большой экспортируемый файл (400 МБ) по определенному слову. Мы скажем уникальное слово в этом примере PYTHONEXP,

Пример:

XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxx 12.34.34.34 xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxx
xxxx 12.34.34.34 xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx

XXXXX PYTHONEXP xxxxxx
xxxxxxx 55.44.44.44 xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxx 55.44.44.44 xxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx

XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxx 77.66.66.66 xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxx
xxxxxx 77.66.66.66 xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx

XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxx 99.88.88.88xxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx

XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxx 22.33.33.33 xxxxxxxxxxxxxxxx
xxxxxxxxx
xxxxxxx 22.33.33.33 xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx

XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxx 99.88.88.88 xxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx

Теперь давайте представим, что x — это случайные слова, но каждый кусок разделяет уникальное слово (PYTHONEXP) в самом начале. Я хочу иметь возможность сегментировать каждую часть и удалить дубликаты IP-адресов в только эти сегменты. В идеале я хотел бы вывод, как это:

XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxx 12.34.34.34 xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxx
xxxx  xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx

XXXXX PYTHONEXP xxxxxx
xxxxxxx 55.44.44.44 xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxx  xxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx

XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxx 77.66.66.66 xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxx
xxxxxx  xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx

XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxx xxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx

XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxx 22.33.33.33 xxxxxxxxxxxxxxxx
xxxxxxxxx
xxxxxxx  xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx

XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxx  xxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx

Обратите внимание, что у меня еще есть 2 записи для 99.88.88.88 в моем желаемом выводе вместо 4. Моя главная цель — удалить дубликаты в эти сегменты на основе линий, которые просто содержат PYTHONEXP, Я был бы очень признателен за любую помощь в этом или знаю, если это вообще возможно. Я надеюсь, что я объяснил это правильно или это имеет смысл.

1

Решение

С этим в качестве входного файла:

$ cat file
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxx 12.34.34.34 xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxx xxxx 12.34.34.34 xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxx 55.44.44.44 xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxx 55.44.44.44 xxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxx 77.66.66.66 xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxx xxxxxx 77.66.66.66 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxx 99.88.88.88 xxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxx 22.33.33.33 xxxxxxxxxxxxxxxx xxxxxxxxx xxxxxxx 22.33.33.33 xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxx 99.88.88.88 xxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx

Мы можем выбрать только те строки, которые содержат PYTHONEXP и для них удалите второе вхождение IP-адреса следующим образом:

$ sed -En '/PYTHONEXP/{ s/(( ([[:digit:]]+\.){3}[[:digit:]]+).*)(\2)/\1/; p }' file
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxx 12.34.34.34 xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxx xxxx xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxx 55.44.44.44 xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxx xxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxx 77.66.66.66 xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxx xxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxx xxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxx 22.33.33.33 xxxxxxxxxxxxxxxx xxxxxxxxx xxxxxxx xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxx xxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx

Это соответствует вашему желаемому результату.

Как это устроено

  • -E говорит sed использовать более современные расширенные регулярные выражения.

  • -n говорит sed не печатать, если мы явно не попросим об этом.

  • /PYTHONEXP/{ ... } говорит sed выбирать только те строки, которые соответствуют регулярному выражению PYTHONEXP и для этих строк примените команды в фигурных скобках. В нашем случае фигурные скобки содержат две команды:

    • s/old/new/ это команда замещения, которая в нашем случае удаляет второе вхождение IP-адреса из строки.

    • p говорит sed напечатать полученную строку.

Команда подстановки выглядит так:

s/(( ([[:digit:]]+\.){3}[[:digit:]]+).*)(\2)/\1/
----------------------------------   ----
|                       |
This matches a space followed     |
by an IP address                  |
(This is saved in group 2.)       |
|
This matches another
occurrence of the same IP


--------------------------------------
|
This matches a space and an IP
followed by anything and this
is save as group 1.
1

Другие решения

встречаются ли повторяющиеся строки? ххх ты упомянул в файле.
если так, то ниже должно работать в Bash
имя кота | grep -i PYTHONEXP | уник

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector