Mam matrycę, która wygląda następująco:
Wejście :
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
I chciałbym wyodrębnić dla każdego wiersza listę liter odpowiadającą wartości 1.
Wyjście :
E,I
D
D
A
A,C,G
A,D,H
A,E,F,G
Próbowałem podzielić nagłówek i dopasować słowa do liczb, ale nie udało mi się.
text-processing
awk
fusion.slope
źródło
źródło
NR == 1 { split($0,values) }
next
znaku na końcu pierwszego wiersza, aby nie trzeba było testować przeciwnych warunków dla kolejnych wierszy.NR > 2
naNR > 1
.awk
, albo wklej kod do pliku i uruchom go za pomocąawk -f that.script.file input-file
Kolejny z
perl
-a
opcja podziału linii wejściowej na białe spacje, dostępna w@F
tablicyif($. == 1){ @h=@F }
zapisz nagłówek, jeśli pierwszy wiersz@i = grep {$F[$_]==1} (0..$#F)
zapisz indeks, jeśli wpis jest1
print join ",",@h[@i]
wypisuje tylko te indeksy z tablicy nagłówka, używając,
jako separatoraźródło
Nadal dla zabawy,
zsh
wersja:${a:^b}
zamyka dwa tablice, aby uzyskać A 0 B 0 C 0 D 0 E 1 F 0 G 0 H 0 I 1${(j<>)...}
łączy elementy bez niczego pomiędzy, więc staje się A0B0C0D0E1F0G0H0I1${...//(?0|1)}
my rozebrać?0
i1
od niego tak staje EI:${(s<>)...}
podziel na nic, aby uzyskać tablicę jednego elementu na literę: EI${(j<,>)...}
dołącz do tych z,
-> E, I.źródło
zsh
inna powłoka odbash
(i znacznie mocniejsza i o wiele lepsza konstrukcja, jeśli mnie zapytasz).bash
pożyczył tylko drobny ułamekzsh
„s funkcji (jak{1..4}
,<<<
,**/*
) nie wymienionymi tu Większośćbash
” s funkcje są inaczej zapożyczone zksh
.Inne rozwiązanie awk :
Wyjście:
źródło
Oto rozwiązanie w Perlu:
Działa poprzez odczytywanie kolumn nagłówka do tablicy, a następnie, dla każdego wiersza danych, kopiowanie nazwy kolumny do tablicy wyjściowej, jeśli dopasowana kolumna danych ma wartość true. Nazwy kolumn są następnie drukowane oddzielone przecinkami.
źródło
sed
Jeden dla zabawy:Dzięki GNU
sed
możesz uczynić go bardziej czytelnym dzięki:Nieco krótsza wersja, zakładając, że w każdej linii jest zawsze taka sama liczba cyfr:
To samo co powyżej, z tą różnicą, że zamieniamy przetłumaczone i indeksowane części, co pozwala na pewne optymalizacje.
źródło
python3
źródło
Rozwiązanie Pure Bash:
źródło
LESS="+/^ {3}Array" man bash
powinna zawierać wszystkie informacje potrzebne do tablic bash. Możesz edytować odpowiedź, aby dodać wszelkie przydatne wyjaśnienia.źródło