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) }
next
al final de la primera línea para que no necesite probar una condición opuesta para las líneas posteriores.NR > 2
aNR > 1
.awk
o pegue el código en un archivo y ejecúteloawk -f that.script.file input-file
Otro con
perl
-a
opción para dividir la línea de entrada en espacios en blanco, disponible en@F
matrizif($. == 1){ @h=@F }
guardar el encabezado si la primera línea@i = grep {$F[$_]==1} (0..$#F)
guardar índice si la entrada es1
print join ",",@h[@i]
imprima solo los índices de la matriz de encabezado utilizando,
como separadorfuente
Aún por diversión, una
zsh
versió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?0
y1
de é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
zsh
un shell diferentebash
(y mucho más potente y con un diseño mucho mejor si me preguntas).bash
ha 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
sed
uno 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
python3
fuente
Solución pura de bash:
fuente
LESS="+/^ {3}Array" man bash
debería proporcionar toda la información necesaria para los arrays de bash. Puede editar la respuesta para agregar cualquier aclaración útil.fuente