J'ai une matrice qui ressemble à ceci:
Entrée :
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
Et je voudrais extraire pour chaque ligne la liste des lettres correspondant à la valeur 1.
Sortie :
E,I
D
D
A
A,C,G
A,D,H
A,E,F,G
J'ai essayé de diviser l'en-tête et de faire correspondre les mots avec les chiffres, mais j'ai échoué.
text-processing
awk
fusion.slope
la source
la source
NR == 1 { split($0,values) }
next
à la fin de la première ligne afin de ne pas avoir à tester une condition opposée pour les lignes suivantes.NR > 2
àNR > 1
.awk
, ou collez le code dans un fichier et exécutez-le avecawk -f that.script.file input-file
Un autre avec
perl
-a
option pour diviser la ligne d'entrée sur les espaces blancs, disponible en@F
tableauif($. == 1){ @h=@F }
enregistrer l'en-tête si la première ligne@i = grep {$F[$_]==1} (0..$#F)
enregistrer l'index si l'entrée est1
print join ",",@h[@i]
imprimer uniquement les index du tableau d'en-têtes en utilisant,
comme séparateurla source
Toujours pour le plaisir, une
zsh
version:${a:^b}
zippe les deux tableaux, vous obtenez donc A 0 B 0 C 0 D 0 E 1 F 0 G 0 H 0 I 1${(j<>)...}
joint les éléments sans rien entre eux, il devient donc A0B0C0D0E1F0G0H0I1${...//(?0|1)}
nous en retirons le?0
et1
il devient donc EI:${(s<>)...}
diviser sur rien pour obtenir un tableau d'un élément par lettre: EI${(j<,>)...}
rejoindre ceux avec,
-> E, I.la source
zsh
un shell différent debash
(et beaucoup plus puissant, et avec un bien meilleur design si vous me le demandez).bash
a emprunté une infime fraction dezsh
« la fonction de (comme{1..4}
,<<<
,**/*
) pas ceux mentionnés ici, la plupart desbash
» caractéristiques de sont par ailleurs empruntésksh
.Une autre solution awk :
Le résultat:
la source
Voici une solution en Perl:
Il fonctionne en lisant les colonnes d'en-tête dans un tableau puis, pour chaque ligne de données, en copiant le nom de la colonne dans un tableau de sortie si la colonne de données correspondante est évaluée comme vraie. Les noms de colonne sont ensuite imprimés séparés par des virgules.
la source
Un
sed
pour le plaisir:Avec GNU
sed
, vous pouvez le rendre un peu plus lisible avec:Une version légèrement plus courte, en supposant qu'il y a toujours le même nombre de chiffres sur chaque ligne:
Comme ci-dessus, sauf que nous échangeons les parties traduites et indexées, ce qui permet certaines optimisations.
la source
python3
la source
Solution pure bash:
la source
LESS="+/^ {3}Array" man bash
devraient fournir toutes les informations nécessaires pour les tableaux bash. Vous êtes libre de modifier la réponse pour ajouter toute clarification utile.la source