Nowe posty

Autor Wątek: odleglosc miedzy kolumnami  (Przeczytany 4652 razy)

kordi

  • Gość
odleglosc miedzy kolumnami
« dnia: 2012-09-03, 00:21:14 »
Chcialbym polaczyc pliki, w ktorych znajduja sie kolumny z wartosciami. Nic trudnego:

 paste nr1.txt nr2.txt nr3.txt>calosc.txt
ale zastanawiam sie jak zrobic, by po sklejeniu odlelosc miedzy tymi kolumanmi danych wynosila 2 spacje

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3062
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
odleglosc miedzy kolumnami
« Odpowiedź #1 dnia: 2012-09-03, 07:02:56 »
paste nr1.txt nr2.txt nr3.txt  | sed 's/\\t/  /' >calosc.txt
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

kordi

  • Gość
odleglosc miedzy kolumnami
« Odpowiedź #2 dnia: 2012-09-03, 09:02:46 »
NIestety ta komenda sprawia, ze pojawiaja sie 2 spacje tylko pomiedzy pierwsza i druga kolumna :(

snajper_8383

  • Gość
odleglosc miedzy kolumnami
« Odpowiedź #3 dnia: 2012-09-03, 10:09:54 »
A zrób tak:

paste nr1.txt nr2.txt nr3.txt  | sed 's/\\t/  /g' >calosc.txt
literka g mówi sedowi aby zamiany robił globalnie a nie tylko do pierwszego wystąpienia tablulatora

kordi

  • Gość
odleglosc miedzy kolumnami
« Odpowiedź #4 dnia: 2012-09-03, 11:56:03 »
Seredecznie dziekuje!

Teraz pojawil mi sie inny problem:
mam pliki z danymi, ktore znajuja sie w 1 wierszu. Polaczylam te pliki podobnie jak poprzednio:
 cat  li.txt  na.txt  k.txt rb.txt cs_izo.txt >calosc.txt
i otrzymalanm:
 108.0 132.92 131.24 154.41 215.35
 154.73 193.83 195.91 239.55
 225.21 247.35 1095.64
 336.79 421.21
 379.38
Jednakze zastanawiam sie jak zrobic, by
1) wyrownac te dane w kolumnach
2)yrownac wiersze do prawej strony - zeby wygladalo to w nastepujacy sposob:
 108.0 132.92 131.24 154.41 215.35
       154.73 193.83 195.91 239.55
             225.21 247.35 1095.64
                     336.79 421.21
                            379.38

snajper_8383

  • Gość
odleglosc miedzy kolumnami
« Odpowiedź #5 dnia: 2012-09-03, 18:41:48 »
To aby wyrównać wiersza do prawej można to zrobić tak:
stwórz nowy plik i wklej kod poniżej:
BEGIN {
y=0}
{tab[NR] = $0
x = length($0)
if (y < x)
y=x
}
END {
for(i=1;i<=NR;i++)
printf("%"y"s\\n",tab[i])
}
potem uruchom:

awk -f plik_z_kodem twoj_plik
Nie jest to doskonałe rozwiązanie ale nie mam teraz zbytnio dużo czasu. Jeśli chcesz się bawić z formatowaniem tekstu to poczytaj o awk i perlu.


kordi

  • Gość
odleglosc miedzy kolumnami
« Odpowiedź #7 dnia: 2012-09-04, 19:48:50 »
Wielkie dzieki za pomoc! Bardzo mi to pomoglo. :)

Chcialbabym jeszcze zapytac czy w awk moge storzyc tablice z wyrazami, podobnie jak w bashu:
np.
 imona=(ola, ala, marysia)
?

chcialabym na pocztku kazdej liniii dopisac takie imona

czyli chcialbym zrobic cos w tym stylu
for(i=1;i<=NR;i++)
  for(k=1;k<=3;k++)
printf(imona[k]"%"y"s\\n",tab[i])
Bede wdzieczna za podpowiedz, jak to zrobic.

snajper_8383

  • Gość
odleglosc miedzy kolumnami
« Odpowiedź #8 dnia: 2012-09-04, 23:33:59 »
Tak awk ma tablice. Tylko trzeba pamiętać, że wszystkie tablice w awk są asocjacyjne.
Aby stworzyć taką tablicę z imionami to musiałbyś użyć funkcji split. Ten przykład co podałeś wyglądałby tak:
split("ola,ala,marysia", imiona, ",")
Pierwszym argumentem jest łańcuch do rozdzielenia, drugim tablica gdzie będą umieszczone wartości, a trzecim znak ogranicznika (separatora). Indeks tablice będzie się rozpoczynał o 1.
Jeśli chodzi o ten drugi przykład to nie bardzo rozumiem co chcesz zrobić. Masz dwie pętle i druga pętla wyświetli ci trzy razy wartości z tab z każdym imieniem. O to ci chodziło?

kordi

  • Gość
odleglosc miedzy kolumnami
« Odpowiedź #9 dnia: 2012-09-04, 23:54:44 »
Chodzilo mi o to, aby kazda linijka rozpoczynala sie od imienia. A imie ma wywolywac imona[k]. Wlasnie przetestowalam to i troche lipnie to wyglada, bo kazda kolumne mi rozpoczyna od imienia:

caly kod wyglada nastepujaco:
BEGIN {
y=0}
{tab[NR] = $0
x = length($0)
if (y < x)
y=x
}
END {
for(i=1;i<=NR;i++)
  for(k=1;k<=3;k++)
printf(imona[k]"%"y"s\\n",tab[i])
}

snajper_8383

  • Gość
odleglosc miedzy kolumnami
« Odpowiedź #10 dnia: 2012-09-05, 00:06:19 »
Spróbuj tak:
BEGIN {
y=0
split("ola,ala,marysia", imiona, ",")
}
{tab[NR] = $0
x = length($0)
if (y < x)
y=x
}
END {
 for(i=1;i<+NR;i++)
   for(k=1;k<=3;k++)
   printf("%-10s %"y"s\\n",imiona[k],tab[i])
}
To trzeba dopracować. Poczytaj trochę o awk nie jest trudny a fajnie się nim formatuje tekst.

snajper_8383

  • Gość
odleglosc miedzy kolumnami
« Odpowiedź #11 dnia: 2012-09-05, 00:10:56 »
Sorki błąd się wkradł w pierwszej pętli jest znak + a powinien być znak =.