Nowe posty

Autor Wątek: Bash , skrypt do dzielenia pliku z cześcią jego zawartości.  (Przeczytany 7508 razy)

Bees

  • Gość
Witam!
Próbuje pisać taki skrypcik, który w końcowym efekcie ma podzielić plik , w którym już wszystko udało mi się ładnie zgromadzić. Jest tam treść i nazwy przyszłych plików, wszystko w jednej, pięknej linii.
tmp.txt:  
5541500 4736000 136.133.163.tfw
5541500 4788000 136.133.164.tfw
itd.
Czym to ugryźć aby powstały nowe pliki z nazwami z ostatniej kolumny oraz zawierały:
136.133.163.tfw:
0.06350000000000 (stałe)
0.00000000000000 (stałe)
0.00000000000000 (stałe)
-0.06350000000000 (stałe)
4736000
5541500

136.133.164.tfw:
itd.

Pozdrawiam!
Bees

xavery

  • Gość
Bash , skrypt do dzielenia pliku z cześcią jego zawartości.
« Odpowiedź #1 dnia: 2008-09-29, 22:58:48 »
Np. za pomocą awk. Stałe to zmienne (!) zadeklarowane w BEGIN. Nazwa pliku to $NF (ostatnia kolumna) a dwie pierwsze kolumny to odpowiednio: $1 i $2.

arctgx

  • Gość
Bash , skrypt do dzielenia pliku z cześcią jego zawartości.
« Odpowiedź #2 dnia: 2008-09-29, 23:00:31 »
Do przetwarzania kolejnych linii i obróbki ich poszczególnych kolumn dobry jest awk, o ile dobrze łapię, co chcesz robić. Rozumiem, że chcesz czytać plik tmp.txt. Skąd się biorą te stałe?

P.S. xavery był pierwszy, ale pytanie o stałe pozostaje aktualne :) Jeśli chcesz tylko biegać po trzeciej kolumnie i potem na nazwach plików z niej wykonywać polecenia, których wynikami będą te "stałe", to może wystarczy cut do takiej przejażdżki.

Bees

  • Gość
Bash , skrypt do dzielenia pliku z cześcią jego zawartości.
« Odpowiedź #3 dnia: 2008-09-30, 00:29:00 »
Cytat: xavery
Np. za pomocą awk. Stałe to zmienne (!) zadeklarowane w BEGIN. Nazwa pliku to $NF (ostatnia kolumna) a dwie pierwsze kolumny to odpowiednio: $1 i $2.
Da się to w jednym przebiegu wykonać, coś nie czaje jak to do końca zrobić.
awk 'BEGIN { print "0.06350000000000\\n0.00000000000000\\n0.00000000000000\\n0.06350000000000\\n"} tmp.txt
dostaje te stałe ale jak powiązać to z resztą to nadal nie wiem.
awk '$0 ~ /tfw/ {print $2,$1}' tmp.txt to owszem działa ale awk '{print $2\\n$1}' tmp.txt już nie.

arctgx

  • Gość
Bash , skrypt do dzielenia pliku z cześcią jego zawartości.
« Odpowiedź #4 dnia: 2008-09-30, 01:04:41 »
'{printf "%s\\n%f\\n%d\\n%d\\n\\n", $3, 0.06350000000000, $2, $1}'
poszerzony o większą ilość stałych powinien wystarczyć.

Jeśli chcesz mieć w wyniku kropkę jako separator części całkowitej od ułamkowej, poprzedź polecenie awk deklaracją LC_NUMERIC=C (przed średnikiem lub bardziej spacją).

Bees

  • Gość
Bash , skrypt do dzielenia pliku z cześcią jego zawartości.
« Odpowiedź #5 dnia: 2008-09-30, 19:32:26 »
Odnoszę wrażenie, że próby pomocy ograniczają się do haseł a nie faktycznej chęci w rozwiązaniu problemu. Problem rozwiązany dzięki koledze.
Przecież Ci którzy na co dzień korzystają z konsoli mają gotowe patenty na rozwiązywanie błahych przecież zadań.  Dla potomnych:
gawk -f awk.awk tmp.txn

awk.awk:
{
filename = sprintf("%s",$NF)
print "                   0.08466666658200" >> filename
print "                   0.00000000000000" >> filename
print "                   0.00000000000000" >> filename
print "                  -0.08466666658200" >> filename
printf("             %0.14f\\\\n",$2) >> filename
printf("             %0.14f\\\\n",$1) >> filename
close(filename)
}
Pozdrawiam!

arctgx

  • Gość
Bash , skrypt do dzielenia pliku z cześcią jego zawartości.
« Odpowiedź #6 dnia: 2008-09-30, 23:21:10 »
Przyznaję się do nieuwagi - przeoczenia tego, że każdy z wyników ma zostać w osobnym pliku zapisany. Moja podpowiedź umieszczała wszystko w jednym pliku.

xavery

  • Gość
Bash , skrypt do dzielenia pliku z cześcią jego zawartości.
« Odpowiedź #7 dnia: 2008-10-01, 10:11:14 »
Cytat: Bees
Odnoszę wrażenie, że próby pomocy ograniczają się do haseł a nie faktycznej chęci w rozwiązaniu problemu.
Odpisując o godz. 23 już nie miałem siły sie zagłębiać w problem a potem nie miałem okazji tu zajrzeć. Mimo to chęć pomocy jest szczera choć nie zawsze przekłada się to na oczekiwania:)

Co do problemu - trochę inaczej zapisałbym skrypt ale mniej więcej o to mi chodziło. Moja wersja to:
BEGIN{
   const1="0.08466666658200";
   const2="0.00000000000000";
   const3="-0.08466666658200";
   }

{
   printf ("\\t%s\\n\\t%s\\n\\t%s\\n\\t%0.14f\\n\\t%0.14f\\n",
          const1,
          const2,
          const3,
          $2,
          $1") >> $NF;
   close ($NF);
   }
Pisane z pamięci bez testowania i bez przekonania, że to działa:)
Moim zdaniem tak jest bardziej elegancko i ciut wydajniej. No ale najważniejsze są działające rozwiązania:)

Bees

  • Gość
Bash , skrypt do dzielenia pliku z cześcią jego zawartości.
« Odpowiedź #8 dnia: 2008-10-01, 20:41:16 »
Dzięki za odpowiedzi ...
:)
do xavera:
Mimo, że z pamięci to nie ma nawet literówki i działa.
Rzeczywiście napisane przejrzyście i treściwie.  I przez takie przykłady można poszerzyć sobie horyzonty a co najważniejsze wykorzystać to w realnych sytuacjach. W podręcznikach znajduję tylko jakieś strasznie abstrakcyjne oderwane od życia przykłady.... i nie zawsze jestem w stanie je właściwie zagregować.

Pozdrawiam!