Скрипт для удаления всего / n количества строк, начинающихся со слова, кроме последней - PullRequest
0 голосов
/ 02 июня 2010

Как удалить все строки ниже слова, кроме последней строки в файле. Предположим, у меня есть файл, который содержит

| 02/04/2010 07:24:20 | 20-24 |         26 |       13 |        2.60 | 
| 02/04/2010 07:24:25 | 25-29 |          6 |        3 |        0.60 | 
+---------------------+-------+------------+----------+-------------+

02-04-2010-07:24 --- ER GW 03

+---------------------+-------+------------+----------+-------------+
| date                | sec   | BOTH_MO_MT | MO_or_MT | TPS_PER_SEC |
+---------------------+-------+------------+----------+-------------+
| 02/04/2010 07:00:00 | 00-04 |         28 |       14 |        2.80 | 
| 02/04/2010 07:00:05 | 05-09 |         27 |       14 |        2.70 | 
...
...
...
...
END OF TPS PER 5 REPORT

и мне нужно удалить все содержимое из «02-04-2010-07: 24 --- ER GW 03», кроме «END OF TPS PER 5 REPORT» и сохранить файл. Это должно быть сделано для около 700 файлов. все файлы имеют одинаковый формат с именем файла datemonthday.

Ответы [ 3 ]

1 голос
/ 02 июня 2010
sed -ni '/ER GW/ b end; p; d; :end $p; n; b end' $file

$ file должен быть именем файла. E.g.:

for file in *.txt ; do
    sed -ni '/ER GW/ b end; p; d; :end $p; n; b end' $file
done
0 голосов
/ 19 марта 2012

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

sed -i '$q;/^02-04-2010-07:24 --- ER GW 03/,$d' *.txt
0 голосов
/ 02 июня 2010

Следующий скрипт awk сделает это:

awk '
    /^02-04-2010-07:24 --- ER GW 03$/ {skip=1}
                                      {ln=$0;if (skip!=1){print}}
    END                               {if (skip==1){print $ln}}'

как показано в следующей расшифровке:

$ echo '| 02/04/2010 07:24:20 | 20-24 |         26 |       13 |        2.60 |
| 02/04/2010 07:24:25 | 25-29 |          6 |        3 |        0.60 |
+---------------------+-------+------------+----------+-------------+

02-04-2010-07:24 --- ER GW 03

+---------------------+-------+------------+----------+-------------+
| date                | sec   | BOTH_MO_MT | MO_or_MT | TPS_PER_SEC |
+---------------------+-------+------------+----------+-------------+
| 02/04/2010 07:00:00 | 00-04 |         28 |       14 |        2.80 |
| 02/04/2010 07:00:05 | 05-09 |         27 |       14 |        2.70 |
...
...
...
...
END OF TPS PER 5 REPORT' | awk '
    /^02-04-2010-07:24 --- ER GW 03$/ {skip=1}
    {ln=$0;if (skip!=1){print}}
    END {if (skip==1){print $ln}}'

, который производит:

| 02/04/2010 07:24:20 | 20-24 |         26 |       13 |        2.60 |
| 02/04/2010 07:24:25 | 25-29 |          6 |        3 |        0.60 |
+---------------------+-------+------------+----------+-------------+

END OF TPS PER 5 REPORT

по запросу.

Разбивка:

  • изначально пропустить 0 (false).
  • если вы найдете строку, с которой хотите начать пропуск, установите skip на 1 (true) - при необходимости измените этот шаблон.
  • если пропуск равен false, выведите строку.
  • независимо от пропуска, сохранить последнюю строку.
  • в конце, если skip is true, вывести последнюю строку (проверка sjip предотвращает двойную печать).

Чтобы сделать это для нескольких файлов, вы можете просто использовать for:

for fspec in *.txt ; do
    awk 'blah blah' <${fspec} >${fspec}.new
done

Команда, необходимая для вашего обновления в комментарии (поиск "--- ER GW 03"):

awk '
    /--- ER GW 03/ {skip=1}
                   {ln=$0;if (skip!=1){print}}
    END            {if (skip==1){print $ln}}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...