Tengo un archivo de datos que contiene una sola región y luego un número variable de ciudades/pueblos de la siguiente manera;-
South,London,Guildford,Winchester
North,Manchester,Leeds
East,Norwich
Necesito producir una salida como esta usando AWK
South,London
South,Guildford,
South,Winchester
North,Manchester etc
Debe circular solo cuando hay una ciudad/pueblo presente.
Respuesta1
$ awk -F ',' 'BEGIN { OFS=FS } { for (i=2; i<=NF; ++i) print $1, $i }' file
South,London
South,Guildford
South,Winchester
North,Manchester
North,Leeds
East,Norwich
Los awk
programas simplemente recorre los campos delimitados por comas de cada línea, desde el campo dos en adelante, y genera cada campo junto con el primer campo en la misma línea.
El BEGIN
bloque simplemente establece el delimitador del campo de salida al mismo que el delimitador del campo de entrada.
Esto funcionaría si sus datos de entrada están en un formato "CSV simple", es decir, si están delimitados por comas y si ninguno de los campos tiene comas o nuevas líneas incrustadas.
Respuesta2
Lo hice con el siguiente método y funcionó bien.
line_count=`awk '{print NR}' p.txt | sort -rn| sed -n '1p'`
for ((i=1;i<=$line_count;i++)); do No_of_columns=`awk -v i="$i" -F "," 'NR==i{print NF}' p.txt`; value=`awk -v i="$i" -F "," 'NR==i{print $1}' p.txt`; colum_count=`awk -v i="$i" -F "," 'NR==i {print NF}' p.txt`; for ((d=2;d<=$colum_count;d++)); do awk -v i="$i" -v value="$value" -v d="$d" -F "," 'NR==i{print value","$d}' p.txt; done; done
producción
South,London
South,Guildford
South,Winchester
North,Manchester
North,Leeds
East,Norwich