Skocz do zawartości

Awk Problem


Carek

Rekomendowane odpowiedzi

Czesc. Z gory wielkei dzieki chociazby za chec pomocy, czy przeczytanie mojego postu. Wiec sprawa ma sie tak... mam do napisania maly prosty program. Program juz jest, z tymze dziala u mnie a na kompie, na ktorym powinien (czyt. na uczelni) nie bardzo :(

polecenie jest proste:

Dane są następujące pliki postaci: 0_1.txt. 1_1.txt, 2_1.txt, 3_1.txt, 0_2.txt, 1_2.txt, ... 3_8.txt,.. . Każdy z tych plików ma następującą postać: 3 stałe etykiety (nazwy), 3 bloki danych, napis koniec i pod nim ewentualne dane informacyjne (nieistotne dla zadania).

Przykładowy plik:

Nazwa1
0.1 Dana1
Nazwa2
0.1 Dana n21
0.1 Dana n22
0.1 Dana n23
Nazwa3
0.1 Dana n31
0.1 Dana n32
0.1 Dana n33
Koniec
Ewa Olejarz

 

Więcej przykładowych plików znajduje się tutaj.

Napisz skrypt, który łączy pliki o tym samym numerze za znakiem _ w jeden plik (czyli np. 0_1.txt. 1_1.txt, 2_1.txt, 3_1.txt w plik out_1.txt), w którym poszczególne bloki danych w obrębie każdej etykiety (nazwy)oraz pomija koniec i tekst, który się za nim znajduje. Czyli dla plików wspomnianych powyżej out_1.txt powinien mieć postać:

 

Nazwa1
0.1 Dana1
1.1 Dana1
2.1 Dana1
3.1 Dana1
Nazwa2
0.1 Dana n21
0.1 Dana n22
0.1 Dana n23
1.1 Dana n21
1.1 Dana n22
1.1 Dana n23
2.1 Dana n21
2.1 Dana n22
3.1 Dana n21
3.1 Dana n22
Nazwa3
0.1 Dana n31
0.1 Dana n32
0.1 Dana n33
1.1 Dana n31
1.1 Dana n32
2.1 Dana n31
2.1 Dana n32
2.1 Dana n33
3.1 Dana n31
3.1 Dana n32

 

 

a oto kod:

 

BEGIN{
 while (("/bin/ls | grep .txt | awk /^[0-9]+_[0-9]+.txt/" | getline linia)>0)
   tab[linia]=1
 for(i in tab){
   out = "out" substr(i,index(i,"_"))
   if ((getline x < i) > 0) tab2[out] = x
 }
 while(length(tab)>0){
   for(i in tab){
     out = "out" substr(i,index(i,"_"))
     if(tab2[out] != 0){ 
print tab2[out] >> out
delete tab2[out]
     }
     while((getline tmp < i) > 0){
if (tmp ~ /Koniec/){
  delete tab[i]
  break
}
if (tmp ~ /Nazwa/){
  tab3[out] = tmp
  break
}
print tmp >> out
     }
   }
   for(i in tab3) tab2[i]=tab3[i]
 }
}

bledy jakie wyskakuja:

awk: syntax error near line 2

awk: illegal statement near line 2

awk: syntax error near line 6

awk: illegal statement near line 6

awk: syntax error near line 15

awk: illegal statement near line 15

awk: syntax error near line 30

awk: bailing out near line 30

 

kombinowalem ze to mzoe przez roznice wersji awk u mnie i na serwerze, jednak nie wiem dlaczego ale te bledy dotycza wszystkich wierszy gdize jest getline a to raczej standardowe polecenie... pls help! :(

 

Edytowane przez WalDo
Proszę korzystać ze znaczników [code][/code] (przywklejkach do 5 linii) oraz [codebox][/codebox] (przy dłuższych)
Odnośnik do komentarza
Udostępnij na innych stronach

Są jakieś błędy, bo przy przeczytaniu 1. pliku (umieściłem w nim zawartość drugiego codboksa z Twojego postu) zaczyna w wiecznej pętli wpisywać "Nazwa3" do out_1.txt, ale problemów z syntaksem nie ma.

 

Problem musisz raczej sam rozwiązać. Nikt z nas nie wie jaki masz system na uczelni, jaką wersję awk, w jaki sposób uruchamiasz skrypt itd. Chociaż z drugiej strony to chyba każdy awk rozpoznaje słowo kluczowe getline

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...