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/.
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
Zrobiłem coś co działa ale jest niezwykle prymitywne zadziała tylko wówczas gdy liczba pól "a - c" jest stała
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.
Offline
od x do konca:
for (i=X; x<NR; i++) printf("%s", $i); printf("\n")
Offline
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
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.
Offline
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
no i trzebabylo tak odrazu a nie komplikowac (lepiej zadawc pytania wprost a nie na okolo - polecam lektore http://rtfm.killfile.pl/) ...
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)
Offline
dzieki !!
o to wlasnie mi chodzilo
dostalem nauczke, nastepnym razem bede walil prosto z mostu ;)
dzieki
Offline
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
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)
Offline
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
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 ...)
Offline
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
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)
Offline