регулярное выражение для группировки их по одному имени

регулярное выражение для группировки их по одному имени

У меня есть следующие строки в foo.txt

aaa:6600 location: US

aaa:6622 location: US

xxx:6601 location: EU

xxx:6602 location: EU

xxx:6603 location: EU

ggg:7701 location: KR

ggg:8808 location: KR

Я хочу сгруппировать все, начиная с одной и той же сборки, и добавить одну новую строку между ними, чтобы конечный результат выглядел следующим образом:

    aaa:6600 location: US
    aaa:6622 location: US

    xxx:6601 location: EU
    xxx:6602 location: EU
    xxx:6603 location: EU

    ggg:7701 location: KR
    ggg:8808 location: KR

решение1

awk -F: '/^$/{next}$1!=f&&NR>1{print ""}{f=$1;print;}' foo.txt

дает

aaa:6600 location: US
aaa:6622 location: US

xxx:6601 location: EU
xxx:6602 location: EU
xxx:6603 location: EU

ggg:7701 location: KR
ggg:8808 location: KR

на выборочных данных.

Объяснение.

Поля -F:says будут разделены двоеточиями. /^$/{next}says пропускает все пустые строки во входных данных. $1!=f&&NR>1{print ""}если текущее имя не совпадает с сохраненным в fи номер строки в файле больше 1, то печатает пустую строку, чтобы начать новую группу. {f=$1;print}для всех строк сохраняет имя в fи печатает строку. Есть способы сделать это короче, но для меня это не требует ничего, кроме базового awk.

решение2

$ awk -F':' '!NF{next} $1 != prev{if (NR>1) print ""; prev=$1} 1' file
aaa:6600 location: US
aaa:6622 location: US

xxx:6601 location: EU
xxx:6602 location: EU
xxx:6603 location: EU

ggg:7701 location: KR
ggg:8808 location: KR

Связанный контент