Ich habe eine Matrix, die wie folgt aussieht:
Eingabe :
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
Und ich möchte für jede Zeile die Liste der Buchstaben extrahieren, die dem Wert 1 entsprechen.
Ausgabe :
E,I
D
D
A
A,C,G
A,D,H
A,E,F,G
Ich habe versucht, die Überschrift zu teilen und die Wörter mit Zahlen abzugleichen, aber ich bin gescheitert.
text-processing
awk
fusion.slope
quelle
quelle
NR == 1 { split($0,values) }
next
am Ende der ersten Zeile zu setzen, damit Sie für nachfolgende Zeilen keine gegenteilige Bedingung testen müssen.NR > 2
zuNR > 1
.awk
oder fügen Sie den Code in eine Datei ein und führen Sie ihn mitawk -f that.script.file input-file
Noch einer mit
perl
-a
Option zum Teilen der Eingabezeile auf Leerzeichen, verfügbar im@F
Arrayif($. == 1){ @h=@F }
Speichern Sie die Kopfzeile in der ersten Zeile@i = grep {$F[$_]==1} (0..$#F)
Index speichern, wenn Eintrag ist1
print join ",",@h[@i]
Gibt nur den Index aus dem Header-Array,
als Trennzeichen ausquelle
Zum Spaß noch eine
zsh
Version:${a:^b}
Zippt die beiden Arrays, sodass Sie A 0 B 0 C 0 D 0 E 1 F 0 G 0 H 0 I 1 erhalten${(j<>)...}
Verbindet die Elemente mit nichts dazwischen, so dass es zu A0B0C0D0E1F0G0H0I1 wird${...//(?0|1)}
Wir entfernen das?0
und1
davon, damit es zu EI wird:${(s<>)...}
Teilen Sie nichts auf, um ein Array mit einem Element pro Buchstabe zu erhalten: EI${(j<,>)...}
verbinde diese mit,
-> E, I.quelle
zsh
ist eine andere Shell alsbash
(und viel leistungsfähiger und mit einem viel besseren Design, wenn Sie mich fragen).bash
nur einen winzigen Bruchteil ausgeliehen hatzsh
‚s - Funktion (wie{1..4}
,<<<
,**/*
) nicht diejenigen , die hier erwähnt, die meistenbash
‘ s Funktionen sind sonst entlehntksh
.Eine andere awk Lösung:
Die Ausgabe:
quelle
Hier ist eine Lösung in Perl:
Es funktioniert, indem die Kopfspalten in ein Array eingelesen werden und dann für jede Datenzeile der Spaltenname in ein Ausgabearray kopiert wird, wenn die übereinstimmende Datenspalte als wahr ausgewertet wird. Die Spaltennamen werden dann durch Kommas getrennt gedruckt.
quelle
Eine
sed
zum Spaß:Mit GNU
sed
können Sie die Lesbarkeit verbessern, indem Sie:Eine etwas kürzere Version unter der Annahme, dass in jeder Zeile immer die gleiche Anzahl von Ziffern steht:
Wie oben, außer dass wir den übersetzten Teil und den Index-Teil austauschen, was einige Optimierungen zulässt.
quelle
python3
quelle
Reine bash Lösung:
quelle
LESS="+/^ {3}Array" man bash
alle Informationen enthalten, die für Bash-Arrays erforderlich sind. Es steht Ihnen frei, die Antwort zu bearbeiten, um hilfreiche Erläuterungen hinzuzufügen.quelle