LINUX.ORG.RU

Help! Чётные слова

 , , ,


0

1

Подскажите оптимальный вариант оставить только чётные слова из строк типа:

Remove: libegl1:i386 (1.0.0-2ubuntu2.3), libegl-mesa0:i386 (19.2.8-0ubuntu0~18.04.3), libgl1:i386 (1.0.0-2ubuntu2.3), libglapi-mesa:i386 (19.2.8-0ubuntu0~18.04.3)
должно получиться
libegl1:i386 libegl-mesa0:i386 libgl1:i386 libglapi-mesa:i386
Пишу из горящего танка 8)

★★★★☆

Последнее исправление: superuser (всего исправлений: 5)

libapt-pkg-dev

This library provides the common functionality for searching and managing packages as well as information about packages.

anonymous
()
echo "Remove: libegl1:i386 (1.0.0-2ubuntu2.3), libegl-mesa0:i386 (19.2.8-0ubuntu0~18.04.3), libgl1:i386 (1.0.0-2ubuntu2.3), libglapi-mesa:i386 (19.2.8-0ubuntu0~18.04.3)" | tr ',' '\n' | sed 's/Remove://;s/(.*$//' | tr -d '\n'
shell-script ★★★★★
()
Ответ на: комментарий от sudoapter

Во - самое то что надо. Но странно что нет простой потоковой утилиты для вывода/удаления n-ных слов с делимитором таким-то. Надо напейсать...

superuser ★★★★☆
() автор топика
Последнее исправление: superuser (всего исправлений: 1)
Ответ на: комментарий от superuser

Но странно что нет простой потоковой утилиты для вывода/удаления n-ных слов с делимитором таким-то. Надо напейсать...

Ну одно дело, когда у вас есть слова с одинаковыми разделителями между всеми, другое дело как у вас: разбить на фразы с одним разделителем и выбрать слова из фраз с другим разделителем. Вторая задача — это просто обычная задача, которая есть просто два раза вызванная задача получить нужные столбцы.

vodz ★★★★★
()
Ответ на: комментарий от superuser

Есть Python и модуль re (там регулярки несколько удобнее всего остального на мой вкус), пиши не хочу.

peregrine ★★★★★
()

pcregrep -o1 '\S+\s(\S+)'

anonymous
()
echo 'Remove: libegl1:i386 (1.0.0-2ubuntu2.3), libegl-mesa0:i386 (19.2.8-0ubuntu0~18.04.3), libgl1:i386 (1.0.0-2ubuntu2.3), libglapi-mesa:i386 (19.2.8-0ubuntu0~18.04.3)' \
    | awk -vRS=',' 'NR==1 {sub("^Remove: ","");} {print $1}'
libegl1:i386
libegl-mesa0:i386
libgl1:i386
libglapi-mesa:i386

А ещё можно и буквально «оставить только чётные»:

echo 'Remove: libegl1:i386 (1.0.0-2ubuntu2.3), libegl-mesa0:i386 (19.2.8-0ubuntu0~18.04.3), libgl1:i386 (1.0.0-2ubuntu2.3), libglapi-mesa:i386 (19.2.8-0ubuntu0~18.04.3)' \
    | awk -vRS=' ' 'NR%2==0'
legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 3)
Ответ на: комментарий от legolegs

А ещё можно и буквально «оставить только чётные»:

а наоборот - скрыть чётные, awk может?
И переносы строк не добавлять бы ещё...

superuser ★★★★☆
() автор топика
Последнее исправление: superuser (всего исправлений: 1)
Ответ на: комментарий от superuser

а наоборот - скрыть чётные, awk может?

конечно. условие awk NR%2==0 означает «делать действие (печать) если остаток от деления номера записи на 2 равен нулю». Заменяем 0 на 1 и будут выводиться нечётные записи.

И переносы строк не добавлять бы ещё…

Можно установить другой выходной разделитель записей, установив переменную ORS (output record separator):

awk -vRS=' ' -vORS=' ' 'NR%2==1'
legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.