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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2007-11-23 19:23:56

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

podział jednego pliku na kilka według kryteriów

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


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

#2  2007-11-23 21:23:04

  LongeR - Członek DUG

LongeR
Członek DUG
Skąd: DT
Zarejestrowany: 2007-09-03
Serwis

Re: podział jednego pliku na kilka według kryteriów

a do czego ma to Ci służyć bo coś  mi w głowie kołacze ale napisz coś więcej...:)


LongeR rządzi, LongeR radzi, LongeR nigdy cię nie zdradzi!!
-->Nic na siłę, lekko młotkiem:D<----> Czy myślenie sprawia Ci ból?<--
Nieważne od czego się zaczyna - kończy się zawsze na Debianie : )
Linux register users: #456947

Offline

 

#3  2007-11-23 22:29:01

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: podział jednego pliku na kilka według kryteriów

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ć


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#4  2007-11-24 00:19:29

  HunteR - DUG

HunteR
DUG
Skąd: ?
Zarejestrowany: 2006-03-14

Re: podział jednego pliku na kilka według kryteriów

Zapisz jako lista.awk

Kod:

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:

Kod:

awk -f lista.awk baza.txt

gdzie:
lista.awk - powyższy plik
baza.txt - lista userów


...

Offline

 

#5  2007-11-26 08:42:27

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

Re: podział jednego pliku na kilka według kryteriów

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:)


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

#6  2007-11-26 09:16:59

  kamikaze - Administrator

kamikaze
Administrator
Zarejestrowany: 2004-04-16

Re: podział jednego pliku na kilka według kryteriów

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

 

#7  2007-11-26 09:25:28

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

Re: podział jednego pliku na kilka według kryteriów

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.


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

#8  2007-11-26 10:04:18

  HunteR - DUG

HunteR
DUG
Skąd: ?
Zarejestrowany: 2006-03-14

Re: podział jednego pliku na kilka według kryteriów

debbie, mozesz do pliku lista.awk dodac wiecej

Kod:

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

 

#9  2007-11-26 10:56:48

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

Re: podział jednego pliku na kilka według kryteriów

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


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

#10  2007-11-26 11:20:49

  HunteR - DUG

HunteR
DUG
Skąd: ?
Zarejestrowany: 2006-03-14

Re: podział jednego pliku na kilka według kryteriów

Zmien

Kod:

BEGIN { RS = "" ; FS = "\n" }

na

Kod:

BEGIN { RS = "" ; FS = "*" }

i bedzie czytal do gwiazdki
Narazie bedzie dzialac pozniej postaram sie napisac zeby to dzialalo porzadnie


...

Offline

 

#11  2007-11-26 11:31:44

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

Re: podział jednego pliku na kilka według kryteriów

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


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

#12  2007-11-26 11:51:26

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

Re: podział jednego pliku na kilka według kryteriów

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)


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

#13  2007-11-26 14:30:33

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

Re: podział jednego pliku na kilka według kryteriów

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)


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

#14  2007-11-26 20:00:29

  HunteR - DUG

HunteR
DUG
Skąd: ?
Zarejestrowany: 2006-03-14

Re: podział jednego pliku na kilka według kryteriów

plik lista.awk:

Kod:

BEGIN { FS = "\n" ; RS = "*" ; OFS = "\n" }
{ print $2 , $3 , $4 , $5 , $6 , $7 , $8 , $9 > $2 }

uruchamianie:

Kod:

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

 

#15  2007-11-26 20:23:02

  czadman - Bicycle repairman

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: podział jednego pliku na kilka według kryteriów

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:

Kod:

split -a d -l 7 plik.txt osoba

http://www.debian.org/logos/openlogo-nd-50.png

Offline

 

#16  2007-11-29 07:33:46

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

Re: podział jednego pliku na kilka według kryteriów

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.


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)