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
Witam! mam taki problem! tzn chcialbym dowiedzieć się czy jest taka możliwość - chodzi mi o to mam plik z danymi osób np plik.txt z zawartością:
numer 1234
imie: Jan
nazwisko: Kowalski
adres: Stodolna 22
kod: 55-249
miasto: Poznań
numer 4321
imie: Piotr
nazwisko: Nowaki
adres: Inna 22
kod: 55-234
miasto: Wrocław
numer 8765
imie: Andrzej
nazwisko: Witkacy
adres: nowsza 20
kod: 55-804
miasto: Warszawa
i teraz tak chodzi mi o to jak zrobić skrypt np w bashu lub w php
który podzieli ten plik tak aby każda osoba i jej dane znalazły sie w osobnych plikach
Offline
a do czego ma to Ci służyć bo coś mi w głowie kołacze ale napisz coś więcej...:)
Offline
LongeR napisał(-a):
a do czego ma to Ci służyć bo coś mi w głowie kołacze ale napisz coś więcej...:)
co za różnica jakie konkretnie jest przeznaczenie? wyraźnie przedstawił zagadnienie
jeśli nie wiesz, to po prostu nie pisz
a teraz na temat:
ja bym spróbował w tym kierunku
1. ustalić liczbę cykli (egrep ^numer plik | wc -l)
2. ustaloną liczbę razy wyświetlić po sześć kolejnych linii pliku, najpierw od 1-6, 8-13, etc. i przekierować do osobnych plików (head -n6 > nowy1, head -n13 | tail -n6 > nowy2, etc.)
pewnie nie jest to najbardziej eleganckie rozwiązanie, ale powinno się sprawdzić
Offline
Zapisz jako lista.awk
BEGIN { RS = "" ; FS = "\n" } { print $1 > $1 print $2 >> $1 print $3 >> $1 print $4 >> $1 print $5 >> $1 print $6 >> $1 }
Następnie wykonaj polecenie:
awk -f lista.awk baza.txt
gdzie:
lista.awk - powyższy plik
baza.txt - lista userów
Offline
oo pomysł HunterA jest elegancki! wszystko robi się ok!:) jedynie co czego zapomniałem dodac a jest to w tym przypadku bardzo istotne że w pliku może byc tak że jedna lub więcej osób może mieć więcej danych czyli plik może wyglądac tak:
numer 1234
imie: Jan
nazwisko: Kowalski
adres: Stodolna 22
kod: 55-249
miasto: Poznań
zainteresowania: cos tam
pesel: 3423423423
numer 4321
imie: Piotr
nazwisko: Nowaki
adres: Inna 22
kod: 55-234
miasto: Wrocław
zainteresowania: sport
numer 8765
imie: Andrzej
nazwisko: Witkacy
adres: nowsza 20
kod: 55-804
miasto: Warszawa
czyli niebardzo jest określona liczba lini dla danej osoby.
Co by mogło ewentualnie ułatwić sprawę: mógłbym zrobić tak że w pliku generowały by sie jakieś znaki specjalne dzięki którym dało by się ich oddzielic bez względu na ilość lini dla danej osoby czyli:
*
numer 1234
imie: Jan
nazwisko: Kowalski
adres: Stodolna 22
kod: 55-249
miasto: Poznań
zainteresowania: cos tam
pesel: 3423423423
*
*
numer 4321
imie: Piotr
nazwisko: Nowaki
adres: Inna 22
kod: 55-234
miasto: Wrocław
zainteresowania: sport
*
numer 8765
imie: Andrzej
nazwisko: Witkacy
adres: nowsza 20
kod: 55-804
miasto: Warszawa
*
np gwiazdka tylo niewiem czy to będzie pomocne( bardzo podoba mi sie to że nazwy plikow mają nazwy nagłówków danej osoby - np numer 4321) był bym bardzo wdzięczny za pomoc:)
Offline
Skoro sam sobie generujesz te pliki i mogą wyglądać jak ty chcesz to ja bym proponował użycie formatu XML. Wtedy dane w pliku bedą bardziej przejrzyste i łątwiej je bedzie wyciągnać. Dane byłyby zapisywane w taki np. sposób:
<osoby>
<osoba>
<numer>1234</numer>
<imie>Jan</imie>
<nazwisko>Kowalski</nazwisko>
<adres>Stodolna 22</adres>
<kod>55-249</kod>
<miasto>Poznań</miasto>
<zainteresowania>cos tam</zainteresowania>
<pesel>3423423423</pesel>
</osoba>
...
</osoby>
Mógłbyś użyć języka skryptowego obsługującego XML-e i ułatwiającego prace z nimi. Myśle że to dobre rozwiazanie i nie trzeba kombinować z tymi gwiazdkami, bo możę potem jakieś nowe dane dojdą albo co i bedzie problem.
Offline
tzn sprawa jest taka że kompletnie nieznam xml'a i w bashu pewnie szybciej umiałbym sobie poradzić.A w prawdzie skrypt fajnie działa tylko sie zastanawiam nad jakąś pętlą ktora będzie robić do gwiazdki i zapisywac w nowym pliku itd.
Offline
debbie, mozesz do pliku lista.awk dodac wiecej
print $7 >> $1 print $8 >> $1
zrob tyle printow ile masz maxymalnie liny w jednej sekcji, jezeli u innego usera bedzie mnie to do pliku zostanie wyslany tylko 'enter'.
Offline
no wtedy by bylo w miare ok! tylko zauwarzyłem teraz że może się pojawić także pusta linia w danych dla jednej llub większości osób np:
numer 1234
imie: Jan
nazwisko: Kowalski
adres: Stodolna 22
kod: 55-249
miasto: Poznań
zainteresowania: cos tam
pesel: 3423423423
numer 4321
imie: Piotr
nazwisko: Nowaki
adres: Inna 22
kod: 55-234
miasto: Wrocław
zainteresowania: sport
nie dało by rady zrobić tego jakoś do gwiazdki??
czyli jak zobaczy gwiazdke to kończy jeden plik
Offline
Zmien
BEGIN { RS = "" ; FS = "\n" }
na
BEGIN { RS = "" ; FS = "*" }
i bedzie czytal do gwiazdki
Narazie bedzie dzialac pozniej postaram sie napisac zeby to dzialalo porzadnie
Offline
oo tzn jeśli zamieniłem mu na gwiazdkę czyli:
BEGIN { RS = "" ; FS = "*" }
a plik wygląda np tak:
numer 1234
imie: Jan
nazwisko: Kowalski
adres: Stodolna 22
kod: 55-249
miasto: Poznań
*
numer 4321
imie: Piotr
nazwisko: Nowaki
*
adres: Inna 22
kod: 55-234
miasto: Wrocław
*
numer 8765
imie: Andrzej
nazwisko: Witkacy
*
adres: nowsza 20
kod: 55-804
miasto: Warszawa
to tworzy mi tylko plik: numer 1234
w ktorym jest:
numer 1234
imie: Jan
nazwisko: Kowalski
adres: Stodolna 22
kod: 55-249
miasto: Poznań
numer 4321
imie: Piotr
nazwisko: Nowaki
adres: Inna 22
kod: 55-234
miasto: Wrocław
numer 8765
imie: Andrzej
nazwisko: Witkacy
adres: nowsza 20
kod: 55-804
miasto: Warszawa
troche dziwne a też sie zastanawiałem nad zmiana tego znaku
Offline
hmm właśnie może zle to wytlumaczyłem!
chodzi mi o to że jak mam plik:
numer 1234
imie: Jan
nazwisko: Kowalski
adres: Stodolna 22
kod: 55-249
miasto: Poznań
*
numer 4321
imie: Piotr
nazwisko: Nowaki
adres: Inna 22
kod: 55-234
miasto: Wrocław
*
numer 8765
imie: Andrzej
nazwisko: Witkacy
adres: nowsza 20
kod: 55-804
miasto: Warszawa
*
to żeby wynikiem było:
(3 osobne pliki)
plik: numer 1234
numer 1234
imie: Jan
nazwisko: Kowalski
adres: Stodolna 22
kod: 55-249
miasto: Poznań
plik: numer 4321
numer 4321
imie: Piotr
nazwisko: Nowaki
adres: Inna 22
kod: 55-234
miasto: Wrocław
plik: numer 8765
numer 8765
imie: Andrzej
nazwisko: Witkacy
adres: nowsza 20
kod: 55-804
miasto: Warszawa
czyli jeśli jest gwiazdka to żeby stworzyl nowy plik z zawartością aż do drugiej gwiadki ( uwzględniając przerwy w tym pliku)
Offline
dziwi mnie trochę jedna rzecz:
jak robie według enterów czyli:
BEGIN { RS = "" ; FS = "\n" }
to bez problemu dzieli dokładnie w miejscu gdzie jest enter w pliku i nadaje nazwe ( pierwsza napotkana linia )
a jeśli dam mu gwiazdkę:
BEGIN { RS = "" ; FS = "*" }
to tworzy tylko jeden plik z nazwą pierwszej lini pliku . Do tego zawartość pliku jest taka sama jak baza.txt z tym że w miejscu gdzie są gwiazdki jest puste pole ( coś jak by eneter był tam wstawiony)
Offline
plik lista.awk:
BEGIN { FS = "\n" ; RS = "*" ; OFS = "\n" } { print $2 , $3 , $4 , $5 , $6 , $7 , $8 , $9 > $2 }
uruchamianie:
awk -f lista.awk baza.txt
Uwaga! w pliku baza.txt na samym początku musisz zrobić enter(jedna pusta linie) i na końcu pliku skasować gwiazdkę (*)
Jak będę miał czas to zrobię pętle która będzie zliczać ile jest wierszy miedzy gwiazdkami, ale narzazie nie mam czasu :/
Offline
debbie napisał(-a):
Witam! mam taki problem! tzn chcialbym dowiedzieć się czy jest taka możliwość - chodzi mi o to mam plik z danymi osób np plik.txt z zawartością:
numer 1234
imie: Jan
nazwisko: Kowalski
adres: Stodolna 22
kod: 55-249
miasto: Poznań
numer 4321
imie: Piotr
nazwisko: Nowaki
adres: Inna 22
kod: 55-234
miasto: Wrocław
numer 8765
imie: Andrzej
nazwisko: Witkacy
adres: nowsza 20
kod: 55-804
miasto: Warszawa
i teraz tak chodzi mi o to jak zrobić skrypt np w bashu lub w php
który podzieli ten plik tak aby każda osoba i jej dane znalazły sie w osobnych plikach
Zakładając równą ilość pól dla każdej osoby i pojedyncze linie między wpisami:
split -a d -l 7 plik.txt osoba
Offline
no po tej zmianie:
BEGIN { FS = "\n" ; RS = "*" ; OFS = "\n" }
{ print $2 , $3 , $4 , $5 , $6 , $7 , $8 , $9 > $2 }
działa elegancko! zastanawiam się jeszcze czy niedało by się for'em określić liczby lini ( danych uzytkownika) tzn żeby nie trzebabyło wpisywać $2 , $3 itd.
Offline
Strony: 1