Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Napsalem skrypt, ktory generuje taki raport "users.csv":
@admin;;
user1;yes;
user2;yes;
user3;yes;
@develop;;
user4;no;
user5;yes;
user6;no;
user7;no;
@progs;;
user8;no;
user9;no;
...
Kolejny skrypt tworzy taki oto raport "groups.csv"
@admin;path1;12;
user9;path10;1;
@admin;path2;12;
@develop;path3;12;
@develop;path4;1;
@progs;path5;1;
@progs;path6;1;
@progs;path7;1;
@progs;path8;1;
...
Chce polaczyc te oba powyzsze "users.csv" "groups.csv" wyniki i uzyskac taki oto raport koncowy "result.csv"
@admin;path1;12;;;
@admin;path2;12;;;
user1;@admin;yes;12;
user2;@admin;yes;12;
user3;@admin;yes;12;
@develop;path3;12;;;
@develop;path4;1;;;
user4;@develop;no;12 1;
user5;@develop;yes;12 1;
user6;@develop;no;12 1;
user7;@develop;no;12 1;
@progs;path5;1;;;
@progs;path6;1;;;
@progs;path7;1;;;
@progs;path8;1;;;
user8;@progs;no;1;
user9;@progs;no;1;
...
Niestety tylko i wylacznie w bash.
Dzieki.
Offline
Użyj polecenia cat.
Offline
Trudne
Trywialne.
Wystarczy cat i przekierowanie. By potem posortować jak w podanym przykładzie użyj sort. (Dopisek: wróć, od razu można posortować, bez cata)
Nie chcę dzielić włosa na czworo, ale przypadkiem w pliku csv (Coma Separated Values), wartości nie powinny być oddzielone przecinkami, a nie średnikami? ;)
Ostatnio edytowany przez azhag (2009-01-19 11:07:58)
Offline
cat ? hmmm...
jakos nie wyobrazam sobie polaczenia tych dwoch wynikow cat'em... zapomnialem dodac, ze plik pierwszy jak i rowniez drugi bedzie ulegal zmianie (beda dodawane, usowane grupy oraz uzytkownicy).
Offline
To będziesz musiał używać cat po każdej operacji zmiany. Chyba lepiej byłoby użyć w taki razie bazy danych zamiast csv.
Offline
ok, chyba tylko ja zauwazylem ze chesz laczyc takze pola i to inteligentnie ... czyli:
* w users.csv podmienic kazde okreslenie grupy typu "@admin;;" na wszystkie rekordy opisujace ta grupe z result.csv
* nastepnie w polach dotyczacych clonkow tej grupy dodac informacje o tej grupie ...
pytanie tylko jak rozumiesz "wylacznie w bash" ... bo jezeli chialbys sie ograniczyc tylko do polecen wbudowanych to bedzie ciezko ... jezeli dopuszczasz komendy takie jak awk, sed (w systemach POSIXowych sa standardem) to problemu nie ma ... ja bym to robil w oparciu o awk
Offline
patrykxes napisał(-a):
jakos nie wyobrazam sobie polaczenia tych dwoch wynikow cat'em
cat plik1 plik2 > plik3
Teraz jednak przyjrzałem się temu co masz i co chcesz osiągnąć, i faktycznie — zadanie jest nieco bardziej skomplikowane niż się wydaje na pierwszy rzut oka.
#!/bin/bash : > /tmp/wynik for GROUP in $(awk -F';' '/^@/ {print $1}' groups.csv | uniq | sort); do grep $GROUP groups.csv >> /tmp/wynik echo user >> /tmp/wynik done
ja zrobiłem do połowy, przeróbka users.csv to zadanie dla awka, którego nie znam dostatecznie
Offline
Czesc
bercik napisał(-a):
ok, chyba tylko ja zauwazylem ze chesz laczyc takze pola i to inteligentnie ... czyli:
* w users.csv podmienic kazde okreslenie grupy typu "@admin;;" na wszystkie rekordy opisujace ta grupe z result.csv
* nastepnie w polach dotyczacych clonkow tej grupy dodac informacje o tej grupie ...
pytanie tylko jak rozumiesz "wylacznie w bash" ... bo jezeli chialbys sie ograniczyc tylko do polecen wbudowanych to bedzie ciezko ... jezeli dopuszczasz komendy takie jak awk, sed (w systemach POSIXowych sa standardem) to problemu nie ma ... ja bym to robil w oparciu o awk
Tak, jak najbardziej awk, sed (chodzi mi o bash z uzyciem wlasnie awk,sed,itp...)
azhag napisał(-a):
Teraz jednak przyjrzałem się temu co masz i co chcesz osiągnąć, i faktycznie — zadanie jest nieco bardziej skomplikowane niż się wydaje na pierwszy rzut oka.
Kod:
#!/bin/bash : > /tmp/wynik for GROUP in $(awk -F';' '/^@/ {print $1}' groups.csv | uniq | sort); do grep $GROUP groups.csv >> /tmp/wynik echo user >> /tmp/wynik done
Dzieki, hmm... wlasnie sie zastanawiam jak tego dokonac, niestety nie jestem zaawansowanym programista :(
Offline
bedzie to mniej wiecej cos takiego:
awk -F";" ' /^@/{ GRUPA=$1; NUM=""; system("grep " GRUPA " groups.csv > wynik"); while(getline <"wynik") { print $0; NUM=NUM " " $3; } close("wynik"); next } { printf("%s;%s;%s;%s;\n", $1, GRUPA, $2, NUM) } ' users.csv
Offline
bercik napisał(-a):
bedzie to cos takiego:
Kod:
awk -F";" ' /^@/{ GRUPA=$1; NUM=""; system("grep " GRUPA " groups.csv > wynik"); while(getline <"wynik") { print $0; NUM=NUM " " $3; } close("wynik"); next } { printf("%s;%s;%s;%s;\n", $1, GRUPA, $2, NUM) } ' users.csv
Wielkie Dzieki :) dziala :)
Bardzo dziekuje :)
Pozdrawiam
Offline
Strony: 1