Как удалить строки после первой проверки следующих 3 строк - PullRequest
0 голосов
/ 17 мая 2019

У меня есть текстовый файл, похожий на этот

00:00:24.752
8,594
3,847
0
00:00:25.228
0
1,692
0
00:00:25.738
6,548
5,304
0
00:00:26.248
1,807
417
0
00:00:26.758
3,913
5,335
0
00:00:26.792
0
00:00:27.234
0
00:00:27.268
0
0
0
00:00:27.778
9,903
2,345
0
00:00:27.812
0
00:00:28.322
0
9,501
0

это сетевой трафик, и первая часть представляет собой временную метку, а следующие две отправляются и получают трафик. Третий ноль, который я не знаю, почему там.
Поэтому моя цель состоит в том, чтобы сохранить только те строки, которые имеют как минимум значение отправленного / полученного трафика, а также каждый раз удалять третий 0. Так что у меня будет такой результат.

00:00:24.752
8,594
3,847
00:00:25.228
0
1,692
00:00:25.738
6,548
5,304
00:00:26.248
1,807
417
00:00:26.758
3,913
5,335
00:00:27.778
9,903
2,345
00:00:28.322
0
9,501

Попытался использовать awk в смысле проверки длины текущей строки, и если строка меньше 8 символов, выведите эту строку и следующие 2. Но поскольку файл не всегда имеет по крайней мере 2 значения после отметка времени не работает должным образом.

Ответы [ 3 ]

2 голосов
/ 17 мая 2019
awk '
/[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}/ {
  if (NR > 1) p() 
  i = 0
}
{ buf[++i] = $0 }
END { p() }
function p() {
  if (buf[2] || buf[3]) {
    print buf[1]
    print buf[2]
    print buf[3]
  }
  delete buf
}' file

p - это функция, которая печатает буферизованные строки, если 2-я и 3-я из них не пустые или нулевые, и очищает буфер. Он вызывается всякий раз, когда отображается временная метка (и это не первая строка в файле) и когда нажата EOF. Таким образом, приведенный выше скрипт в основном буферизует строки между двумя временными метками, и, если они соответствуют критериям, что после временной метки должно быть не менее двух строк, и они не должны быть равны нулю, печатает их.

0 голосов
/ 17 мая 2019

Если вы хотите опустить все 4-ые строки, используйте скрипт awk для достижения этого:

awk 'RN % 4{print}' input.txt

Результаты с желаемым выводом.

0 голосов
/ 17 мая 2019

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

sed '/:/!{H;$!d};x;/\n.*\n.*\n/{/\n0\n0\n0/!s/\n0$//p};x;h;d' file

Если текущая строка не является отметкой времени (не содержит :), добавьте ее в область удержания, а если это не последняя строка, удалите ее.

Если текущая строка является либо последней строкой, либо отметкой времени, перейдите в область удержания и убедитесь, что предыдущая запись содержит 4 строки и что последние 3 строки не обнуляются, если это так, удалите последнюю строку записи и распечатайте исправленную запись.

Вернитесь к пространству образца, замените пространство удержания текущей строкой (отметкой времени) и удалите ее.

N.B. При удалении строки дальнейшая обработка sed для текущей строки не выполняется.

...