Я не понимаю, при чем тут 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
Использование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
, он отбрасывается, иначе выводится.
С помощьюawk
-я чувствую, что это можно упростить, но пока не могу
awk '/uid=/ && p~/uid=/{c=4; next}
!(c && c--) && NR>1{print p} {p=$0}
END{if(c==0)print p}' ip.txt
/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