Как найти дубликаты поля более 100 файлов

Я добавляю это, потому что когда-нибудь оно мне понадобится ... снова.

Иногда вы получаете неправильное соответствие номеров устройств Ethernet и MAC-адресов. Иногда это действительно важно, например, при работе в виртуальной машине, когда каждое устройство назначается отдельной VLAN.

  1. Выключите сетевые интерфейсы, затем
  2. измените /etc/udev/rules.d/70-persistent-net.rules (или его эквивалент)
  3. перезагрузите с помощью udevadm control --reload-rules
  4. повторно запустить с помощью триггер udevadm --attr-match = subsystem = net
  5. активировать сетевые интерфейсы.

Я был удивлен, насколько хорошо это сработало.

1
21.11.2018, 19:47
2 ответа

Предполагая, что под «ключом» вы подразумеваете «столбец», вы могли бы использовать что-то вроде этого:

cut -f 11 -d "|" $(find. -type f -iname "*.txt") | sort | uniq -d | sed 's/\\/./g' | while read duplicate; do grep -rHn "|$duplicate|" * ; done

Вам, вероятно, придется изменить содержимое $(find -iname)на любое расширение, которое имеют ваши файлы журналов (, или просто удалить его, если единственными файлами в каталоге являются файлы журналов. Это рекурсивно найдет все файлы журналов и сопоставит их.

Вывод некоторых тестовых данных выглядит так:

test_data.txt:1:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msg|Country not known test_data.txt:5:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msg|Country not known test_data_2.txt:2:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIDONTMATCH|Country not known test_data.txt:3:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIDONTMATCH|Country not known test_data_2.txt:4:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIlikecake|Country not known test_data.txt:7:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIlikecake|Country not known

Где это все строки в файлах с дублированным полем 11.

Объяснение того, что делает команда.

cut -f 11 -d "|"Получить 11-е поле (с разделителями |)

find. -type f -iname "*.txt"рассматривать любые файлы, оканчивающиеся на.txt в текущем каталоге (рекурсивно)

sort | uniq -dпоказать все дублированные "поля 11"

sed /\\/./g'Это хак, потому что \испортил bash. Мы заменяем его на ., который соответствует любому символу grep.

while read duplicate; do grep -rHn "|$duplicate|" *; done-перебирать список дубликатов и находить все их вхождения, выводя имя файла и номера строк, в которых встречаются дубликаты.

1
28.01.2020, 00:23

Непонятно, что вы пытаетесь сделать, но я попробую:

Во-первых, какова ваша линия? Вы дали это как строку:

Error: null, Data:|862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2011\07\05\ITE854075_RECardProtectionlogi.msg|Country not known

Если ваши строки выглядят так, значит, ваш ключ находится в поле 11

2011\07\05\ITE854075_RECardProtectionlogi.msg

но что определяет ваш ключ? Это просто быть в поле 11?

Если это так, вы можете сделать что-то подобное в каталоге с вашими целевыми файлами:

sort --field-separator='|' --key=11 <(\grep --recursive --line-number --color=always --with-filename '' *)

это даст вам раскрашенный вывод имени файла, за которым следует номер строки в этом файле, а затем сама строка, все отсортированные по ключевому полю 11; поэтому в выводе все совпадающие ключи в любом файле появляются друг над другом...

Я думаю, что это даст вам ключ, по крайней мере


Обратите внимание:на обратную косую черту перед grep, чтобы предотвратить любые псевдонимы grep.

0
28.01.2020, 00:23

Теги

Похожие вопросы