необходимо удалить строки из системного журнала, которые имеют определенную строку данных дубликата - PullRequest
0 голосов
/ 18 марта 2011

Эй, ребята, интересно, кто-нибудь может помочь с этой маленькой дилеммой

Попытка удалить строки из текстового файла системного журнала, которые имеют повторяющиеся строки

10 марта 06:51:11 [http-8080-1] ИНФОРМАЦИЯ com.MYCOMPANY.webservices.userservice.web.UserServiceController [u: 2533274802474744 | 360] Авторизовать [platformI $ tformIdAndOs = 2533274802474744 | 360 | пользовательский регион 360]

затем на несколько строк вниз

10 марта 06:52:03 [http-8080-1] ИНФОРМАЦИЯ com.MYCOMPANY.webservices.userservice.web.UserServiceController [u: 2533274802474744 | 360] Авторизовать [platformI $ tformIdAndOs = 2533274802474744 | 360 | пользовательский регион 360

получил то же самое с точки зрения числа u: но проблема в том, что мне нужно удалить дубликаты и просто оставить один, и файл содержит несколько дубликатов с разными номерами u: и его длина составляет 14 000 строк.

Может кто-нибудь сказать мне, могу ли я использовать awk? СЭД? или сортировать что то подобное? удаление строк с определенной строкой, которая является дубликатом.

Мне, в принципе, нужно дедуплицировать, но проблема в том, что только одна маленькая часть строки - это индикатор.

Любая помощь приветствуется! спасибо

1 Ответ

0 голосов
/ 18 марта 2011

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

  • Сначала создайте новый файл, назовите его uvalues.txt
  • Читать файл построчно, для каждого строка grep для "u:", сохраните результат в $ u
  • если $ u существует в uvalues.txt, игнорировать эта строка
  • если $ u не существует в uvalues.txt, запишите эту строку в другой файл, запишите $ u в uvalues.txt
  • повтор

Код будет выглядеть примерно так:

#!/bin/bash

touch uvalues.txt

for l in `cat file.txt`; do
        uvalue=`echo "$l" | grep "u:" | cut -f2 -d':' | cut -f1 -d'|'`
        #if uvalue is not empty, check it against our temp file
        if [ -n "$uvalue" ]; then
                existing_value=`grep "$uvalue" uvalues.txt`;
                #if it is empty, it means it's not a duplicate
                if [ -z "$existing_value" ]; then
                        echo $l >> save.txt
                        echo $uvalue >> uvalues.txt
                fi
        fi
done

rm uvalues.txt
...