Tengo un archivo delimitado por tabulaciones con varias columnas. Me gustaría aumentar la cantidad de veces que veo algo en la columna A e imprimir los datos asociados con el valor en la columna A en una nueva columna B.
Ex:
1 blue
1 green
1 red
100 blue
100 red
Me gustaría un archivo de salida que lea
3 1 blue,green,red
2 100 blue,red
¿Hay alguna manera de hacer esto usando awk o perl?
Respuesta1
en awk:
{
if (count[$1] == "") {
count[$1] = 1;
results[$1] = $2;
} else {
count[$1] = count[$1] + 1;
results[$1] = results[$1] "," $2;
}
}
END {
for (number in count) {
print count[number],number,results[number];
}
}
da como resultado la salida de:
2 100 blue,red 3 1 blue,green,red
para sus datos de muestra anteriores.
Es posible que el orden de los resultados no sea exactamente el que usted desea, no estoy seguro de cuán importante sea para usted.
Respuesta2
Esto es lo que he probado y que puede funcionar para usted. NOTA: "\011"
= carácter de tabulación, cambiar a " "
espacio)
awk 'BEGIN { s = "\011"; c = "," ; cnt = 0; all_colors = "" } {
if ( NR == 1 ) { num = $1; colors[cnt++] = $2 }
else {
if ( num != $1 ) {
for (x=0; x<cnt; x++) {
all_colors = all_colors colors[x]
}
print cnt s num s all_colors; cnt = 0; all_colors = ""
num = $1; colors[cnt++] = $2
}
else { colors[cnt++] = c $2 }
}
}
END {
all_colors = ""
for (x=0; x<cnt; x++) { all_colors = all_colors colors[x] }
print cnt s num s all_colors
}' tab_file
tab_file output
1 blue 3 1 blue,green,red
1 green 2 100 blue,red
1 red
100 blue
100 red