2017-02-07 2 views
-2

У меня есть много файлов (acls), содержащих ips, macs, hostnames и другие данные.найти и удалить дублирующийся контент в нескольких файлах

Важно: Проблема заключается в «дублировании содержимого» в файлах. Нет «повторяющиеся строки»

Пример: (только файл, но я не имею несколько добавлений)

192.168.1.20;08:00:00:00:00:01;peter 
192.168.1.21;08:00:00:00:00:01;android 
192.168.1.21;08:00:00:00:00:02;john 
192.168.1.22;08:00:00:00:00:03;julia 
192.168.1.23;08:00:00:00:00:04;android 

линии с дублированным контентом. И это то, чего я хочу. Команда, чтобы сказать мне этот результат:

192.168.1.20;08:00:00:00:00:01;peter 
192.168.1.21;08:00:00:00:00:01;android 
192.168.1.21;08:00:00:00:00:02;john 
192.168.1.23;08:00:00:00:00:04;android 

Дубликат содержание в линии выше 08: 00: 00: 00: 00: 01, 192.168.1.21 и андроид

Command Я использую для поиска дубликатов в папку Acls (не работает):

cat /home/user/files/* | sort | uniq -c | head -20 

Я пытался с этим python script, но результаты не как ожидалось

Первый (по крайней мере) я хочу, чтобы обнаружить линии с DUPL и (если возможно) удалять строки с дублирующимся контентом.

Благодаря

+7

Нет дублирующегося содержимого. Все строки различны – Anthon

+2

Должно ли содержимое быть точно таким же или сравнивать только некоторые столбцы? Вы хотите изменить файлы на месте или получить уникальный список? Если строка появляется дважды, должна ли она отображаться только один раз или быть полностью удалена? –

+0

@ gus27 или Unix & Linux (из-за 'bash') – Anthon

ответ

0

Учитывая ваши комментарии по поводу того, что вы считаете, как дублировать это должно быть близко:

$ a=$(cut -d';' -f1 c.txt |sort |uniq -d) 
$ b=$(cut -d';' -f2 c.txt |sort |uniq -d) 
$ c=$(cut -d';' -f3 c.txt |sort |uniq -d) 
$ echo "$a:$b:$c" 
192.168.1.21:08:00:00:00:00:01:android 

Но на самом деле мы говорим о трех различных ситуациях.
Переменная a содержит только дублирующий IP, игнорируя поля отдыха.
Переменная b содержит только дублирующий MAC, игнорируя поля отдыха.
Переменная c содержит только дублирующее имя хоста, игнорируя поля отдыха.

Я не вижу смысла в этой запутанной информации.

Единственное объяснение состоит в том, что вы можете использовать Grep позже, как это:

$ grep -v -e "$a" -e "$b" -e "$c" c.txt 
192.168.1.22;08:00:00:00:00:03;julia;222222 

Чтобы получить строки из исходного файла, которые имеют совершенно уникальный IP-адрес, который не был использован хотя бы один раз, совершенно уникальный MAC и полностью уникальное имя хоста.

Это то, чего вы хотите достичь?

+0

Спасибо. Я думаю, что с этим «grep» достаточно, чего я хочу. – bdc

+0

Вы можете инвертировать столбцы с вырезом: 'grep -v -e '$ a" -e "$ b" -e "$ c" c.txt | cut -d'; ' -f 2,1,3,4'. Чтобы сопоставить несколько файлов, замените c.txt на '* .txt' или' * 'или'/directory/* ' –

+0

не работает. например: grep -v -e "$ a" | cut -d ';' -f 2,3,4 (формат a; 08: 00: 00: 00: 00: 03; 192.168.1.22; julia; 222222 интересующие колонки: mac; ip; host 2,3,4), а переменная a = $ (cut -d ';' -f 2,3,4/directory/* | sort | uniq -d). Как я могу сделать это в одной командной строке без использования переменных? – bdc

Смежные вопросы