Используя редактор sed
разновидности GNU
, мы можем сделать это следующим образом:
sed -Ee '
$d;N
/\s(\S+)\n.*\s\1$/!p
D
' input.file
Мы постоянно переносим две строки в пространство шаблонов, N
, и ищем переход последнего поля. Как только мы обнаруживаем один, /\s(\S+)\n.*\s\1$/!p
, мы печатаем все пространство шаблонов. Затем мы удаляем первую часть D
пространства шаблонов в обоих сценариях с переходом или без перехода, поскольку на этом этапе использование первой части заканчивается.
Управление переходит к началу кода sed и, если мы еще не достигли eof, мы повторяем эту процедуру снова и снова. Eof останавливает операцию, $d
.
Выход:
A 20 30 loss
A 30 40 no
A 60 70 no
A 70 80 gain
Сопоставление с образцом выполняется с помощью конструкции case
в оболочках POSIX:
CHANNELS=
set -- stable beta dev master --debug
echo "DEBUG: Before while $@";
while [ "$#" -gt 0 ]; do
echo "DEBUG: Inside while $1";
case $1 in
(-*) ;;
(*)
echo "DEBUG: Inside case (*)"
CHANNELS="$CHANNELS $1";;
esac
shift
done
echo "DEBUG: After while $CHANNELS";