2016-01-13 2 views
0

У меня есть txt-файл, который содержит 70K строк данных с 8 или около того столбцов. Второй столбец определяет тип данных (SMP или MSG). Внутри этого файла данных имеется 62 ряда данных, идентифицированных как «MSG». Я пытаюсь сделать простую команду awk или даже короткий скрипт python, который удалит 1 строку данных, которая предшествует каждой строке «MSG» в файле. Пример раздела из фактического файла данных:Удалить каждую строку данных, предшествующих строке «MSG» в txt-файле?

976810 SMP 2 144.79 108.25 
993461 SMP 2 144.68 108.15 
945277 SMP 2 144.90 108.10 
945828 SMP 3 144.83 108.31  
945237 MSG 3 # Message: 5 
943544 SMP 3 144.87 108.58  
945209 SMP 3 144.93 108.68 
976916 SMP 3 145.17 108.72 
997481 SMP 3 140.90 109.33 
914197 SMP 4 140.79 109.15 
945300 MSG 4 # Message: 0 
940848 SMP 4 140.84 109.11 
945568 SMP 4 140.91 109.03 
945200 SMP 4 141.08 109.01 

Таким образом, в приведенном выше примере, мне нужно удалить многопроцессорные строки перед каждой строкой MSG. Я думал, может быть, я бы использовал команду awk для поиска $ 2 == 'MSG', а затем удалить строку MSG-1 или что-то в этом роде. Я очень ценю любые предложения/помощь/рекомендации по этому поводу!

С уважением

+0

Используя приведенный выше пример, можно добавить, что еще раз, но показать, что результат должен выглядеть? Это позволит людям понять ваш вопрос :) – Trevor

+0

Что вы ожидаете, если есть последовательные строки «MSG»? – donkopotamus

+0

Привет! Есть, безусловно, нет последовательных линий MSG. Между каждой строкой MSG всегда имеется не менее 240 строк данных SMP. Причина, по которой мне нужно удалить 1 строку перед каждой строкой MSG, состоит в том, что нумерация имеет небольшую задержку, когда данные получаются (как вы можете сказать выше, число рядом с SMP должно увеличиваться в каждом MSG, но, к сожалению, раз увеличивает испытание # прямо перед MSG даже выскакивает) –

ответ

2
$ awk 'NR>1 && $2!="MSG"{print prev} {prev=$0} END{print prev}' file 
976810 SMP 2 144.79 108.25 
993461 SMP 2 144.68 108.15 
945277 SMP 2 144.90 108.10 
945237 MSG 3 # Message: 5 
943544 SMP 3 144.87 108.58 
945209 SMP 3 144.93 108.68 
976916 SMP 3 145.17 108.72 
997481 SMP 3 140.90 109.33 
945300 MSG 4 # Message: 0 
940848 SMP 4 140.84 109.11 
945568 SMP 4 140.91 109.03 
945200 SMP 4 141.08 109.01 
+1

Ed Мортон, Спасибо за помощь ! Это потрясающе. Моя первоначальная команда awk, к сожалению, отличалась от нескольких символов, отличных от того, что вы опубликовали, и, конечно, выяснение того, что было не так, заняло больше времени, чем нужно. Весьма признателен. Для всех остальных/новых кодеров для обеспечения вывода команды awk в новый файл: more yourTextFile.txt | awk 'NR> 1 && $ 2! = "MSG" {print prev} {prev = $ 0} END {print prev}'> newTextFile.txt –

+0

Приветствую вас. ответьте на это последнее предложение в своем комментарии - использование 'more' для передачи файла в awk бесполезно (так же, как UUOC - google it), а перенаправление вывода - это базовая оболочка, не имеющая отношения к awk или любой другой конкретной команде, и ей не нужно в этом контексте. –

+0

Спасибо Ed. Конечно, это базовая оболочка, но я считаю, что больше информации лучше, чем у будущих Googlers с аналогичными проблемами. Плюс^трубопровод связал то, что мне нужно, из этого вопроса, с вашей помощью. –