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  2009-03-01 17:46:51

  przemek11 - Użytkownik

przemek11
Użytkownik
Zarejestrowany: 2009-03-01

problem z parsowaniem pliku - awk

po kilku przeksztalceniach dostaje np. taki plik:

3 1 2 3 a b c
3 1 2 3 e f g
3 1 2 3 h i j

pierwszy wyraz (3) mowi ile bedzie nastepnych liczb (1, 2, 3), dalej sa jakies dane
jako pierwszy wyraz nie zawsze bedzie 3, takze nie moge nic zrobic 'na sztywno'
chcialbym w wyniku otrzymac cos takiego:
3 1 a b c
3 2 e f g
3 3 h i j

moze ktos mi podpowie, jak rozwiazac ten problem?
dzieki !

Offline

 

#2  2009-03-02 13:58:53

  HAL9000 - Użytkownik

HAL9000
Użytkownik
Zarejestrowany: 2006-04-22

Re: problem z parsowaniem pliku - awk

Zrobiłem coś co działa ale jest niezwykle prymitywne zadziała tylko wówczas gdy liczba pól "a - c" jest stała

Kod:

awk '{print $1, NR, $($1+2), $($1+3), $($1+4)}'

Próbowałem za pomocą pętli ale nie udało mi się tego sformatować odpowiednio niestety nie wiem również ja wypisać od pola x do końca.


For some reason I'm thinking I'm still 25 but I act like I'm 12.

Offline

 

#3  2009-03-02 19:38:09

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: problem z parsowaniem pliku - awk

od x do konca:

Kod:

for (i=X; x<NR; i++) printf("%s", $i); printf("\n")

"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#4  2009-03-02 22:53:12

  przemek11 - Użytkownik

przemek11
Użytkownik
Zarejestrowany: 2009-03-01

Re: problem z parsowaniem pliku - awk

HAL9000 napisał(-a):

Zrobiłem coś co działa ale jest niezwykle prymitywne zadziała tylko wówczas gdy liczba pól "a - c" jest stała

Kod:

awk '{print $1, NR, $($1+2), $($1+3), $($1+4)}'

Próbowałem za pomocą pętli ale nie udało mi się tego sformatować odpowiednio niestety nie wiem również ja wypisać od pola x do końca.

moze podalem zly przyklad ;)
to nie musza byc kolejne numery,
moze byc taka sytuacja:
3 11 22 3 a b c
3 11 22 3 e f g
3 11 22 3 h i j

Offline

 

#5  2009-03-03 21:03:17

  HAL9000 - Użytkownik

HAL9000
Użytkownik
Zarejestrowany: 2006-04-22

Re: problem z parsowaniem pliku - awk

Tak z ciekawości zapytam to w końcu które ty te pola chcesz mieć jako końcowy wynik?
Najpierw piszesz
3 1 2 3 a b c
3 1 2 3 e f g
3 1 2 3 h i j
następnie
3 1 a b c
3 2 e f g
3 3 h i j
co wygląda następująco
pozostaw pole nr 1 w polu nr 2 wpisz numer rekordu(linii) i wypisz pozostały tekst.


For some reason I'm thinking I'm still 25 but I act like I'm 12.

Offline

 

#6  2009-03-10 09:58:21

  przemek11 - Użytkownik

przemek11
Użytkownik
Zarejestrowany: 2009-03-01

Re: problem z parsowaniem pliku - awk

ok, to moze teraz wkleje oryginal (kawalek pliku obs w formacie rinex - jakby ktos chcial wiedzec ;)
mam mniej wiecej cos takiego:
08 10 30 17 33 41.0000000  0  9 11  3 22 32 18 28 19  6 14         -0.000330818
-425020157.464 6  23433511.782        3183.390
-436527401.100 8  21026670.072       -2479.089
-438276683.439 8  20776244.483       -1396.841
-424603064.019 6  24390877.205        3502.029
-431366167.549 8  23154228.059       -3012.996
-425560492.908 7  25177629.187        2307.713
-437406101.279 8  20440782.396         199.130
-432181471.122 8  21546605.039       -2675.855
-432685708.398 7  22950735.830        2860.882

liczba 9 (w pierwszej linii) oznacza liczbe satelitow (11, 3, 22, 32, 18, 28, 19, 6, 14) - ta liczba oczywiscie moze sie zmieniac
kolejne linie to dane do odpowiednich satelitow, tzn.
druga linia (-425020157.464 6  23433511.782        3183.390) to dane dla 11
trzecia dla 3
itd....

chcialbym otrzymac plik, w ktorym w jednej kolumnie bylaby informacja, ktorego satelity sa to dane, czyli przykladowo:
-425020157.464 6  23433511.782        3183.390   11
-436527401.100 8  21026670.072       -2479.089   3
-438276683.439 8  20776244.483       -1396.841   22
-424603064.019 6  24390877.205        3502.029   32
-431366167.549 8  23154228.059       -3012.996   18
-425560492.908 7  25177629.187        2307.713   28
-437406101.279 8  20440782.396         199.130   19
-432181471.122 8  21546605.039       -2675.855   6
-432685708.398 7  22950735.830        2860.882   14

mam nadzieje, ze teraz jasno napisalem z czym mam problem ;)
najgorsze jest to, ze to sie zmienia dynamicznie, dlatego nie moge nic zalozyc 'na sztywno'
z gory dzieki za wszelkie podpowiedzi !

Offline

 

#7  2009-03-10 13:23:22

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: problem z parsowaniem pliku - awk

no i trzebabylo tak odrazu a nie komplikowac (lepiej zadawc pytania wprost a nie na okolo - polecam lektore http://rtfm.killfile.pl/) ...

Kod:

NF > 5 {
    LICZBA_REKORDOW=$8
    REKORD=0
    for (i=0; i<LICZBA_REKORDOW; i++) {
        NUMERY[i] = $(i+9)
    }
    next
}
{
    print $1, $2, $3, $4, NUMERY[REKORD++]
}

Ostatnio edytowany przez bercik (2009-03-10 13:24:17)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#8  2009-03-12 20:59:18

  przemek11 - Użytkownik

przemek11
Użytkownik
Zarejestrowany: 2009-03-01

Re: problem z parsowaniem pliku - awk

dzieki !!
o to wlasnie mi chodzilo
dostalem nauczke, nastepnym razem bede walil prosto z mostu ;)

dzieki

Offline

 

#9  2009-04-27 20:48:26

  przemek11 - Użytkownik

przemek11
Użytkownik
Zarejestrowany: 2009-03-01

Re: problem z parsowaniem pliku - awk

tamten skrypt smiga - lekko go przerobilem
ale teraz mam taki oto plik wejsciowy (troche podobny) - przyklada ponizej:

09  4 22 16  0 20.0000000  0 12G26G27G03G25G21G28G24G08G19G10G15G07
  22927732.938    22927730.598    -7056089.21206  -5461434.04906        43.000 
        23.000        3498.965        2726.467 
  23409147.609    23409143.383    -8082859.93306  -6269449.97606        43.000 
        26.000        2619.806        2041.407 
  24879681.438    24879678.578     -434479.87804    947014.31305        38.000 
        16.000       -2124.862       -1655.736 
  25106134.484    25106132.082    -1713910.59005    -95258.59206        41.000 
        22.000       -3170.153       -2470.250 
  24912721.125    24912718.922      -28729.09004     76856.34105        38.000 
        16.000        -411.469        -320.625 
  21381663.484    21381659.051   -21157219.76807 -15481817.54507        50.000 
        37.000        1564.487        1219.080 
  25128330.063    25128328.016    -3466444.32704    590772.57105        39.000 
        20.000       -2383.244       -1857.073 
  20602299.867    20602296.867   -29203231.23507 -21501911.42707        50.000 
        40.000       -1209.226        -942.254 
  24166946.141    24166940.426    -6252026.54605  -4846141.08406        41.000 
        25.000          23.312          18.165 
  21799788.148    21799784.797   -19151925.90606 -13760421.50707        47.000 
        34.000       -2320.947       -1808.530 
  22262753.031    22262749.020   -19264819.90806 -14569737.41407        46.000 
        34.000        2747.157        2140.642 
  23174463.805    23174460.637   -13394116.74505  -9575297.48606        40.000 
        27.000       -3125.611       -2435.541

mam problem z tym, ze jeden wiersz z danymi jest w dwoch linijkach, np:
  23174463.805    23174460.637   -13394116.74505  -9575297.48606        40.000 
        27.000       -3125.611       -2435.541

na wyjsciu (podobnie jak wtedy) chcialbym miec mniej wiecej cos takiego:
  22927732.938    22927730.598    -7056089.21206  -5461434.04906        43.000         23.000        3498.965        2726.467  G26
  23409147.609    23409143.383    -8082859.93306  -6269449.97606        43.000         26.000        2619.806        2041.407  G27

itd.....
bede b. wdzieczny nawet za jakakolwiek podpowiedz !

Offline

 

#10  2009-04-27 22:42:29

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: problem z parsowaniem pliku - awk

Kod:

REKORD%2==0 {
    print $0
    tmp=REKORD++/2
    next
}
{
    print $1, $2, $3, NUMERY[tmp]
    REKORD++
}

Ostatnio edytowany przez bercik (2009-04-27 22:43:14)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#11  2009-04-27 23:40:25

  przemek11 - Użytkownik

przemek11
Użytkownik
Zarejestrowany: 2009-03-01

Re: problem z parsowaniem pliku - awk

dzieki za przyklad, ale co to jest REKORD?
do NUMERY mam wczytywac analogicznie jak w poprzednim przykladzie?
tylko z ta roznica, ze chyba musze wykorzystac np. substr - bo teraz w: 12G26G27G03G25G21G28G24G08G19G10G15G07 nie ma separatora, a wtedy byla spacja

nie powinienem najpierw wyciac piewszych 2 znakow z tej wartosci - zeby wiedziec, ile razy mam pozniej leciec petla, tak jak we wczesniejszym przykladzie?

dzieki !

Offline

 

#12  2009-04-28 14:10:26

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: problem z parsowaniem pliku - awk

REKORD to tak jak w poprzednim przykladzie licznik inicjalizowany na zero ... NUMERY wypelniasz analogicznie ...

ten string nalezy sparsowac tak jak piszesz np. przy pomocy substr (ewentualnie jezeli tam zawsze te numery zaczynaja sie od G to mozna tego G uzyc jako separatora dla split ...)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#13  2009-04-30 22:13:20

  przemek11 - Użytkownik

przemek11
Użytkownik
Zarejestrowany: 2009-03-01

Re: problem z parsowaniem pliku - awk

ok, dzieki !
zrobie tak samo jak z poprzednim plikiem - gsubem zamienie G na spacje, i juz ;)
mam tylko problem z tym, ze dane sa w dwoch wierszach, np:

23174463.805    23174460.637   -13394116.74505  -9575297.48606        40.000 
        27.000       -3125.611       -2435.541

w jaki sposob moglbym zapisac to w jednym wierszu?

dzieki za pomoc !

Offline

 

#14  2009-05-01 01:00:38

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: problem z parsowaniem pliku - awk

przeciez to jak obsluzyc dane w dwuch wierszach (newt bez ich laczenia) napisalem pare postow wyzej ... jak chesz laczyc wiersze to w pierwszym wypisujesz przy pomocy ptintf zamiast print (tak zeby nie dawac znaku nowej linii)

Ostatnio edytowany przez bercik (2009-05-01 01:02:38)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

Stopka forum

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