expresiones regulares para agruparlos con el mismo nombre

expresiones regulares para agruparlos con el mismo nombre

Tengo las siguientes líneas en 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

Quiero agrupar todos comenzando con la misma recopilación y tener una nueva línea entre ellos para que el resultado final se vea como el siguiente

    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

Respuesta1

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

da

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

sobre los datos de la muestra.

Explicación.

Los -F:campos dice estarán delimitados por dos puntos. /^$/{next}dice que se omitan todas las líneas en blanco en la entrada. $1!=f&&NR>1{print ""}Si el nombre actual no es el mismo que el elemento guardado fy el número de línea en el archivo es mayor que 1, imprima una línea en blanco para comenzar un nuevo grupo. {f=$1;print}para todas las líneas guarde el nombre fe imprima la línea. Hay formas de acortarlo, pero para mí esto no requiere nada más que lo básico awk.

Respuesta2

$ 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

información relacionada