Transponer texto usando sed

-3

Por favor, ayúdame a descubrir cómo resolver esto usando sed.

Dado el siguiente texto:

Kerala
        4222        8129        8163        8164        

Delhi      
        8502        8503        8504        8505       
Goa
        1          39      45

Quiero convertirlo al siguiente formato:

Kerala,4222
Kerala,8129
Kerala,8163
Delhi,8502
Delhi,8503
Delhi,8504
Delhi,8505
Goa,1
Goa,39
Goa,45
jamsheer np
fuente
Tiene que ser sed y no awk (o perl, python etc)?
RedGrittyBrick
Bienvenido a Superusuario! Debes saber que las preguntas aquí generalmente muestran un esfuerzo de investigación, que es probablemente la razón por la que actualmente se está votando. SU no es un servicio de escritura de guiones; Si muestra algunos pasos que ha tomado, podemos ayudarlo a iterarlos. Asegúrate de leer el centro de ayuda para tener una idea de lo que se espera aquí.
Mikey T.K.

Respuestas:

0

Supongamos que su archivo tiene el nombre test1

El comando completo se ve así (en una línea):

names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g") && names2=(${names//;/ }) && for var in "${names2[@]}"; do numbers=$(cat test1 | sed -n "/$var/{n;p}" | sed "s/\s/;/g"); numbers2=(${numbers//;/ }); for num in "${numbers2[@]}"; do echo "$var,$num"; done; done

Para una mejor vista, mira este script:

names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g") 
names2=(${names//;/ })
for var in "${names2[@]}"; do 
    numbers=$(cat test1 | sed -n "/$var/{n;p}" | sed "s/\s/;/g")
    numbers2=(${numbers//;/ })
    for num in "${numbers2[@]}"; do 
        echo "$var,$num"
    done
done

Ahora quiero describir todas las partes del comando

DESCRIPCION DEL COMANDO

El comando names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g") me da una lista de los nombres separados con un punto y coma, en su caso Kerala;Delhi;Goa. Los quiero de esta forma, porque ahora puedo cambiarlos a una matriz con el segundo comando names2=(${names//;/ }). Ahora itero a través de todos los nombres, que se hace con la primera for lazo.

El comando numbers=$(cat test1 | sed -n "/$var/{n;p}" |sed "s/\s/;/g"); Me da los números para la variable actual. $var. Es decir. para Kerala esto sería 4222;8129;8163;8164. El comportamiento es el mismo que en el primer comando: quiero cambiarlos a una matriz, así puedo iterarlos, lo cual se hace con el siguiente comando numbers2=(${numbers//;/ });. Ahora recorro los números y los imprimo en la pantalla.

for num in "${numbers2[@]}"; do echo "$var,$num"; done

Espero que esto sea entendible.

kristian
fuente
Funciona ... Muchas gracias por su puntual respuesta ...
jamsheer np