Добрый день. Есть задача - удалить из текстового файла лишние строки, ибо сами файлы выходят по 13 гигов и работать с ними нереально. Файл выглядит примерно так:OW 19954 15.999000 -0.834000 2.834397
-44.78927079 -4.070333251 35.06497982
-5.825511848 -4.037765762 6.221237227
HW 19955 1.008000 0.417000 3.162907
-45.17199080 -4.296462517 34.20231442
-12.34931720 15.72594183 4.818519345
HW 19956 1.008000 0.417000 2.562545
-43.86845066 -3.901549624 34.84741063
-10.80172163 11.57769285 -0.3386270349
OW 19957 15.999000 -0.834000 3.758153
-44.36170737 2.656022350 43.57983123
5.368779841 2.872113622 3.737758955Мне нужно, чтобы удаляло как раз две строки, после каждой "OW" и "HW". Прошу вашей помощи в том, чтобы реализовать данную, казалось бы простую, задачу на awk.
> Мне нужно, чтобы удаляло как раз две строки, после каждой "OW" и
> "HW". Прошу вашей помощи в том, чтобы реализовать данную,|awk '/^[HO]W/{n=3}n>0{n--;next}{print}'
> казалось бы простую, задачу на awk.
>>как раз две строки, после каждой "OW" и "HW".Э-э-мм-м-м... я и сами OW/HW удалили. Не надо было?
> |awk '/^[HO]W/{n=3}n>0{n--;next}{print}'
|awk 'n>0{n--;next}/^[HO]W/{n=2}{print}'
>> казалось бы простую, задачу на awk.
>> Мне нужно, чтобы удаляло как раз две строки, после каждой "OW" и
>> "HW". Прошу вашей помощи в том, чтобы реализовать данную,
> |awk '/^[HO]W/{n=3}n>0{n--;next}{print}'
>> казалось бы простую, задачу на awk.Большое спасибо, сейчас буду пробовать. Как раз и строку с OW, и с HW, и две строки под ними - все нужно удалить. Не могли бы Вы еще подсказать как оформить это в виде отдельного файла, запускаемого awk -f *.awm *.txt > *.txt
Спасибо.
>>> Мне нужно, чтобы удаляло как раз две строки, после каждой "OW" и
>>> "HW". Прошу вашей помощи в том, чтобы реализовать данную,
>> |awk '/^[HO]W/{n=3}n>0{n--;next}{print}'
>>> казалось бы простую, задачу на awk.
> Большое спасибо, сейчас буду пробовать. Как раз и строку с OW, и
> с HW, и две строки под ними - все нужно удалить.
> Не могли бы Вы еще подсказать как оформить это в виде
> отдельного файла, запускаемого awk -f *.awm---00dropOW+HW-and-two-lines-w-them.awm
/^[HO]W/{n=3}n>0{n--;next}
------99the-final-print.awm
{print}
---Хотя, кажется, один -f с несколькими именами файлов _не_ работет.
> *.txt > *.txt
Это так не работает и так не делают...
У sed есть ключ -i, но у awk такого нет.Цикл + вывод во временный файл + переименование.
#!/bin/bash
for f in *.txt; do
awk .... <$f >$TEMPFILE
mv $TEMPFILE $f
done> Спасибо.
На здоровье.
Я имел ввиду awk -f *.awk *.txt > *.txtГде *.awk файл, выполняющий awk '/^[HO]W/{n=3}n>0{n--;next}{print}'
в видеBEGIN {
}.......
END {
}Спасибо
Я имел ввиду awk -f *.awk *.txt > *.txtГде *.awk файл, выполняющий
>[оверквотинг удален]
> -12.34931720 15.72594183 4.818519345
> HW 19956 1.008000 0.417000 2.562545
> -43.86845066 -3.901549624 34.84741063
> -10.80172163 11.57769285 -0.3386270349
> OW 19957 15.999000 -0.834000 3.758153
> -44.36170737 2.656022350 43.57983123
> 5.368779841 2.872113622 3.737758955
> Мне нужно, чтобы удаляло как раз две строки, после каждой "OW" и
> "HW". Прошу вашей помощи в том, чтобы реализовать данную, казалось бы
> простую, задачу на awk.grep -E "^OW|^HW" filename