2017-01-30 3 views
0

Я обрабатываю некоторый вывод полей tshark. Некоторая обработка уже произошла, и теперь есть соседние строки, где последнее поле дублируется. В этих дубликатах отсутствует строка с соответствующим порядковым номером. Задача состоит в том, чтобы сохранить только пары соседних строк, в которых соответствует столбец последовательности. Последнее поле имеет значения 0 и 130, и каждая пара строк начинается с 130. Последовательность представляет собой число 0-15. Поток данных содержит много строк. Поля:awk сохранить смежную строку на основе повторяющегося поля

date  time     src-int dst-int seq  function 
24/01/2017 16:57:27.307400000 10  1000 11  130 
24/01/2017 16:57:27.418675000 1000 10  11  0 
24/01/2017 16:58:53.603604000 1000 10  12  0 
24/01/2017 16:58:54.121603000 10  1000 13  130 
24/01/2017 16:58:54.677752000 10  1000 14  130 
24/01/2017 16:58:54.681079000 1000 10  14  0 
24/01/2017 17:09:12.974979000 10  1000 1  130 
24/01/2017 17:09:12.981149000 1000 10  1  0 
24/01/2017 17:09:13.477211000 1000 10  2  0 
24/01/2017 17:09:14.026279000 1000 10  3  0 

Нужный выход держать пары строк с функцией порядка 130, то 0 и соответствующее число последовательности:

24/01/2017 16:57:27.307400000 10  1000 11  130 
24/01/2017 16:57:27.418675000 1000 10  11  0 
24/01/2017 16:58:54.677752000 10  1000 14  130 
24/01/2017 16:58:54.681079000 1000 10  14  0 
24/01/2017 17:09:12.974979000 10  1000 1  130 
24/01/2017 17:09:12.981149000 1000 10  1  0 

У меня есть решение, что половина работ. Он соответствует \t130$ и получает следующую строку, печать, если последовательность соответствует. Он возвращает хорошие данные, однако он не обрабатывает повторяющиеся значения 130. В данных примера он пропускает последовательность 14. Количество смежных повторяющихся строк является произвольным, поэтому кажется глупо гнездо другого теста.

awk "/\t130$/ {seq=$5; prev=$0; getline;} $5==seq {print prev; print;}" 

Как лучше всего обрабатывать все дубликаты в начальном состоянии?

BTW, используя GNU awk в Windows 7. FWIW две строки в конечном итоге будут объединены с использованием print prev,$0, не показаны для ясности.

ответ

0
$ awk 'p==$5 && q==130 && $6==0 {print b $0} {p=$5; q=$6; b=$0 "\n"}' file 
24/01/2017 16:57:27.307400000 10  1000 11  130 
24/01/2017 16:57:27.418675000 1000 10  11  0 
24/01/2017 16:58:54.677752000 10  1000 14  130 
24/01/2017 16:58:54.681079000 1000 10  14  0 
24/01/2017 17:09:12.974979000 10  1000 1  130 
24/01/2017 17:09:12.981149000 1000 10  1  0 
  • p является предыдущей $5, должна быть таким же, как текущий $5
  • q является предыдущей $6, должно быть 130
  • b буферов предыдущего $0 и \n добавляется в для довольно print
+1

Спасибо. Что касается потока, я считаю, что второе '{действие}' всегда выполняется, так как оно не имеет никакого условия? В этом случае, почему ясно? Кроме того, любая причина добавления конца строки, а не использования двух операторов печати? – gloopy

+0

1. Небрежность. 2. Неспециально. –

+0

Этот ответ подтверждает, что совпадение должно быть в соседней строке. Маркировка правильная, так как она наиболее точно соответствует этой проблеме. – gloopy

1
awk 'NR==1 { print; next } 
    $6 == 0 && $5 == seq && c == 0 { print row; print; c++ } 
    $6 == 130 { seq=$5; row=$0; c=0 } 
' file 
date  time     src-int dst-int seq  function 
24/01/2017 16:57:27.307400000 10  1000 11  130 
24/01/2017 16:57:27.418675000 1000 10  11  0 
24/01/2017 16:58:54.677752000 10  1000 14  130 
24/01/2017 16:58:54.681079000 1000 10  14  0 
24/01/2017 17:09:12.974979000 10  1000 1  130 
24/01/2017 17:09:12.981149000 1000 10  1  0 
+0

Спасибо, мне это нравится и легко модифицируется, чтобы объединить строки. Какова цель «NR == 1 {print; next} '? Используя это решение на входных данных в результате отсутствия строки с функцией seq 11 0. Если я удалю раздел NR == 1, он отлично работает. – gloopy

+0

@gloopy NR == 1 часть предназначена только для печати названия. вы можете удалить это, если не нужно – mug896

+0

aah. Строка заголовка приведена только для описания проблемы :) – gloopy

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