2012-05-14 4 views
0

Мне нужно нарезать несколько ТБ данных журнала и предпочесть скорость командной строки. Перед обработкой я разбиваю файл на куски, но вам нужно удалить некоторые разделы.Файл журнала Slice 3TB с sed, awk & xargs?

Ниже приведен пример формата:

uuJ oPz eeOO 109 66 8 
uuJ oPz eeOO 48 0 221 
uuJ oPz eeOO 9 674 3 
kf iiiTti oP 88 909 19 
mxmx lo uUui 2 9 771 
mxmx lo uUui 577 765 27878456 

Промежутки между первые 3 буквенно-цифровые строки пространства. Все после этого - вкладки. Строки разделяются \n.

Я хочу сохранить только последнюю строку в каждой группе.

Если в группе есть только 1 строка, ее следует хранить.

Вот ожидаемый результат:

uuJ oPz eeOO 9 674 3 
kf iiiTti oP 88 909 19 
mxmx lo uUui 577 765 27878456 

Как я могу сделать это с помощью SED, AWK, xargs и друзей, или я должен просто использовать что-то выше уровня, как Python?

ответ

2

Попробуйте это:

awk 'BEGIN{FS="\t"} 
    {if($1!=prevKey) {if (NR > 1) {print lastLine}; prevKey=$1} lastLine=$0} 
    END{print lastLine}' 

Это сохраняет последнюю строку и выводит ее только тогда, когда он notcies, что ключ изменился.

+0

Это не дает ожидаемого результата, как в вопросе. Цифры в каждой строке различны, и прямое сравнение с предыдущими строками всегда терпит неудачу. – HappyTimeGopher

+0

+1 Работает со мной с данными с разделителями табуляции, которые вы опубликовали. – tripleee

+0

Да, я тоже. Работы Прекрасно теперь я исправил тестовый файл :) – HappyTimeGopher

3
awk -F '\t' ' 
    NR==1 {key=$1} 
    $1!=key {print line; key=$1} 
    {line=$0} 
    END {print line} 
' file_in > file_out 
+0

С этим я получить идентичную копию INFILE. Обратите внимание, что строки не могут сравниваться, например, как все они содержат разные числа после строк. Номера, связанные с последним элементом в группе, должны быть сохранены. – HappyTimeGopher

+0

@tripleee Да, последняя строка также отрезана. Но формат по-прежнему неверен - см. Раздел вывода ожидающего вопроса. – HappyTimeGopher

+0

Я удалил свой комментарий, потому что думал, что ошибся; но кажется, что все правильно: последняя строка отсутствует. – tripleee

0

Это может работать для вас:

sed ':a;$!N;/^\(\S*\s\S*\s\S*\)[^\n]*\n\1/s//\1/;ta;P;D' file