2015-04-09 4 views
0

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

У меня есть 2 журнала.

log1

Cust Subsys StartDate EndDate  col1  col2  col3 
1001 10000  20150501 20150731  6.1700 0.0000 0.0000 -- this line is identical in both logs 
1001 12000  20150401 20150630  0.0000 0.0000 0.0000 -- this line is missing from log2 
1003 13000  20150310 20150630  2.4800 0.0000 0.0000 -- the value in log1.col1 is different from the one in log2.col1 

И log2

Cust Subsys StartDate EndDate  col1  col2  col3 
1001 10000  20150501 20150731  6.1700 0.0000 0.0000 -- this line is identical in both logs 
1003 13000  20150310 20150630  9.1800 0.0000 0.0000 -- the value in log1.col1 is different from the one in log2.col1 
7000 7777  20150406 20150413  4.3300 0.0000 0.0000 -- this line is missing from log1 

Я хотел бы генерировать 3 отчетов из этих журналов:

  1. линии, найденные в log1, но не в log2

  2. Линии найдены в log2, но не в log1

  3. линий, которые идентичны в первых 4 столбцах log1 и log2, но имеют разные значения в столбцах: col1, col2 или col3.

Я сортируется как журналы по всем столбцам:

cat log1 |sort -n -k1,1 -k2,2r -k3,3 -k4,4 -k5,5 -k6,6 -k7,7 > log1.sorted 
cat log2 |sort -n -k1,1 -k2,2r -k3,3 -k4,4 -k5,5 -k6,6 -k7,7 > log2.sorted 

Затем я попытался использовать комлинк, чтобы генерироваться первые 2 доклада:

comm -13 log1.sorted log2.sorted > unique2.log 
comm -23 log1.sorted log2.sorted > unique1.log 

И я заметил, что есть линии в unique1.log, который находится в log1 и log2. (мои журналы имеют более 20 000 строк в каждом). comm не используется для извлечения строк, которые не находятся в одном из журналов? Работает ли это только в том случае, если номера строк одинаковы? (Линия находится в unique1.log это число 188 в log1 и 207 в log2)

Как я мог извлечь данные для 3-го отчета, где я только хочу показать строки, которые имеют различные значения в col1col2 или col3?

Спасибо

ответ

0

Попробуйте использовать его таким образом

comm -23 sort_file1 sort_file2 unique_in_file1 
comm -13 sort_file1 sort_file2 unique_in_file2 
comm -12 sort_file1 sort_file2 common_entries 

Если это не работает для вас, попробуйте посмотреть на команду TGE дифф.

+0

Используя приведенную выше команду 'comm -23 <(sort log1) <(sort log2)> unique_in_file1.log' не работает. Мне была получена следующая ошибка' ksh: 0403-057 Ошибка синтаксиса: '('не ожидается.' – Shiny

+0

sorry @ Блестящий я обновил ответ –