URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9178
[ Назад ]

Исходное сообщение
"awk удаление строк"

Отправлено snysmumrik , 04-Июл-11 13:39 
Добрый день. Есть задача - удалить из текстового файла лишние строки, ибо сами файлы выходят по 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.


Содержание

Сообщения в этом обсуждении
"awk удаление строк"
Отправлено Andrey Mitrofanov , 04-Июл-11 14:32 
> Мне нужно, чтобы удаляло как раз две строки, после каждой "OW" и
> "HW". Прошу вашей помощи в том, чтобы реализовать данную,

|awk '/^[HO]W/{n=3}n>0{n--;next}{print}'

> казалось бы простую, задачу на awk.


"awk удаление строк"
Отправлено Andrey Mitrofanov , 04-Июл-11 14:36 
>>как раз две строки, после каждой "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.


"awk удаление строк"
Отправлено snysmumrik , 04-Июл-11 14:40 
>> Мне нужно, чтобы удаляло как раз две строки, после каждой "OW" и
>> "HW". Прошу вашей помощи в том, чтобы реализовать данную,
> |awk '/^[HO]W/{n=3}n>0{n--;next}{print}'
>> казалось бы простую, задачу на awk.

Большое спасибо, сейчас буду пробовать. Как раз и строку с OW, и с HW, и две строки под ними - все нужно удалить. Не могли бы Вы еще подсказать как оформить это в виде отдельного файла, запускаемого awk -f *.awm *.txt > *.txt

Спасибо.


"awk удаление строк"
Отправлено Andrey Mitrofanov , 04-Июл-11 14:56 
>>> Мне нужно, чтобы удаляло как раз две строки, после каждой "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 удаление строк"
Отправлено snysmumrik , 04-Июл-11 15:04 
Я имел ввиду awk -f *.awk *.txt > *.txt

Где *.awk файл, выполняющий awk '/^[HO]W/{n=3}n>0{n--;next}{print}'
в виде

BEGIN {
      }

.......

END   {
      }

Спасибо


"awk удаление строк"
Отправлено snysmumrik , 04-Июл-11 15:02 
Я имел ввиду awk -f *.awk *.txt > *.txt

Где *.awk файл, выполняющий


"awk удаление строк"
Отправлено erera22 , 04-Июл-11 14:34 
>[оверквотинг удален]
> -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