Tengo una matriz que se parece a la siguiente:
Entrada :
A B C D E F G H I
0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0 0
1 0 1 0 0 0 1 0 0
1 0 0 1 0 0 0 1 0
1 0 0 0 1 1 1 0 0
Y me gustaría extraer para cada fila la lista de letras correspondiente al valor 1.
Salida :
E,I
D
D
A
A,C,G
A,D,H
A,E,F,G
Intenté dividir el encabezado y unir las palabras con los números, pero fallé.
text-processing
awk
fusion.slope
fuente
fuente

NR == 1 { split($0,values) }nextal final de la primera línea para que no necesite probar una condición opuesta para las líneas posteriores.NR > 2aNR > 1.awko pegue el código en un archivo y ejecúteloawk -f that.script.file input-fileOtro con
perl-aopción para dividir la línea de entrada en espacios en blanco, disponible en@Fmatrizif($. == 1){ @h=@F }guardar el encabezado si la primera línea@i = grep {$F[$_]==1} (0..$#F)guardar índice si la entrada es1print join ",",@h[@i]imprima solo los índices de la matriz de encabezado utilizando,como separadorfuente
Aún por diversión, una
zshversión:${a:^b}comprime las dos matrices, por lo que obtienes A 0 B 0 C 0 D 0 E 1 F 0 G 0 H 0 I 1${(j<>)...}une los elementos sin nada intermedio, por lo que se convierte en A0B0C0D0E1F0G0H0I1${...//(?0|1)}quitamos el?0y1de él para que se convierta en EI:${(s<>)...}dividirse en nada para obtener una matriz de un elemento por letra: EI${(j<,>)...}únete a aquellos con,-> E, I.fuente
zshun shell diferentebash(y mucho más potente y con un diseño mucho mejor si me preguntas).bashha prestado sólo una pequeña fracción de lazsh'función s (como{1..4},<<<,**/*) no los mencionados aquí, la mayoría de losbash' s características son tomados de otra forma deksh.Otra solución awk :
La salida:
fuente
Aquí hay una solución en Perl:
Funciona leyendo las columnas de encabezado en una matriz y luego, para cada fila de datos, copiando el nombre de la columna en una matriz de salida si la columna de datos coincidente se evalúa como verdadera. Los nombres de las columnas se imprimen separados por comas.
fuente
Un
seduno por el gusto de hacerlo:Con GNU
sed, puede hacerlo un poco más legible con:Una versión un poco más corta, suponiendo que siempre haya el mismo número de dígitos en cada línea:
Igual que el anterior, excepto que estamos intercambiando las partes traducidas e indexadas, lo que permite algunas optimizaciones.
fuente
python3fuente
Solución pura de bash:
fuente
LESS="+/^ {3}Array" man bashdebería proporcionar toda la información necesaria para los arrays de bash. Puede editar la respuesta para agregar cualquier aclaración útil.fuente