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.
sed
y noawk
(operl
,python
etc)?