Чтобы удалить следующие подряд строки, соответствующие шаблону, и следующие 3 строки

Я не понимаю, при чем тут SOMEMAGIC

попробуйте этот файл awk

{ if ( $1 in a ) {
     if ( length(a[$1]) < length($0)) a[$1]=$0 ;
            } # $1 in a
  else  a[$1]=$0 ; }

END { for ( b in a ) {print a[b] ;}  }

использовать его (предварительная сортировка не требуется)

... egrep -w "${SAT}|${SUN}" | awk -f u.awk | sort
0
06.05.2018, 20:35
2 ответа

Использованиеsed:

$ sed -f script.sed file
dn : Does not matter
 uid=321 456 678
foo=/234
bar=/456
git=/543

dn : Does it matter
 uid=321 456 678
foo=/543
bar=/423
git=/501

...где script.sedэто

H              # Append a newline and the current line to the hold space
/^$/bout       # Empty line: branch to ':out'
$bout          # Last line: branch to ':out'
d              # Delete line, start again from the top
:out
x              # Swap in the data from the hold space
/uid.*uid/d    # Delete the data if it contains two "uid"
s/\n//         # Remove the first embedded newline
               # (implicit print)

Это собирает прочитанные строки в «пространстве хранения» (буфере общего назначения в sed), и когда он достигает пустой строки или конца ввода, пространство хранения содержит один из «блоков» в исходный файл. Если такой блок содержит два экземпляра строки uid, он отбрасывается, иначе выводится.

0
28.01.2020, 04:23

С помощьюawk-я чувствую, что это можно упростить, но пока не могу

awk '/uid=/ && p~/uid=/{c=4; next}
     !(c && c--) && NR>1{print p} {p=$0}
     END{if(c==0)print p}' ip.txt
  • по умолчанию неинициализированные переменные в awk будут пустой строкой или 0 в зависимости от контекста
  • /uid=/ && p~/uid=/, если текущая и предыдущая строки содержат uid=
    • c=4; nextинициализировать cколичеством строк для пропуска (плюс 1 из-за логики, которую я закончил с ). Кроме того, пропустите остальную часть кода
  • !(c && c--) && NR>1{print p}вывести предыдущую строку, если номер текущей строки больше 1 и если c==0. Если cбольше, чем 0, оно будет продолжать уменьшаться до c==0
  • .
  • {p=$0}сохранить предыдущую строку для дальнейшего использования
  • END{if(c==0)print p}напечатать последнюю строку, еслиc==0
0
28.01.2020, 04:23

Теги

Похожие вопросы