########################################################################### # Program. CutFish.awk # Version. $VER: CutFish 1.0 (09.03.93) # Contents. Zerlegt die FishXX1-YY0 Postings in einzelne Files # Author. Jan Hense [juh] (Zerberus: Juggler@AMC.ZER) # Copyright. Freeware # Language. awk # Translator. Gawk (GnuAwk von Fish406) # History. 1.0 [juh] (09.03.93) first release # Usage. vom CLI: Gawk -fCutFish.awk # Remark. pro gefundenem Fisch wird im aktuellen (!) Verzeichnis eine # Remark. Datei ContentsXXX erzeugt, die dann direkt von FishCat ein- # Remark. gelesen werden kann. ########################################################################### # falls bemerkt wird, daß Fische fehlen, warnt diese Funktion den User # und erzeugt das Array missing function ShowMissing(from,to) { printf "\n\n\nACHTUNG: "; if (from+0 == to+0) printf "Fisch %d fehlt!", from; else printf "Fische %d bis %d fehlen!", from, to; for (n=from; n<=to; n++) { missing[MissingFish]=n; MissingFish++; } } # wenn num>1 ist, wird ext für die Pluralform von string angehängt function PutNumber(num, string, ext) { if (num>1) string = string ext; printf "%d %s", num, string; } # nach jedem gefundenen Programm: function PutLines(v) { if (ThisFishPrograms>0) { printf "("; PutNumber(ThisProgramLines,"Zeile","n"); printf ")\n"; } } # nach jedem gefundenen Fisch: function PutPrograms(v) { PutLines(); printf " -----------------\n "; PutNumber(ThisFishPrograms,"Programm","e"); } # Es geht los... BEGIN\ { printf "\nCutFish v1.0 (C)1993 by Jan Hense\n\n"; if (ARGC < 2) { printf "Keine Eingabedatei angegeben!\n"; exit(20); } printf "Eingabedatei: %s", ARGV[1]; CurrFishFileName="nil:"; # evtl. Müll am Anfang >nil: fishno=-1; # noch kein Fisch gefunden MissingFish=0; # Anzahl der fehlenden Fische } # Haben wir einen Header gefunden? /^(This is disk [0123456789]+.*)|(CONTENTS OF DISK [0123456789]+.*)$/\ { oldfishno=fishno; fishno=$4; # wenn das der erste Fischfund ist, errechne den ersten Fisch dieser # Fisch'dekade' minus eins als letzten gefundenen; # sonst gib Anzahl der Programme des letzten Fischfunds aus if (oldfishno<0) oldfishno = fishno - (fishno % 10); else PutPrograms(); ThisFishPrograms=0; # ist eine Lücke zwischen diesem und dem letzen gefundenen Fisch? if (oldfishno+1 != fishno+0) ShowMissing(oldfishno+1,fishno-1); # Ausgeben und mitzählen printf "\n\n\nFish %d:\n\n",fishno+0; FoundFishes++; # neue Datei 'ContentsXXX' öffnen CurrFishFileName = "Contents" fishno; printf "This is disk %s\n\n",fishno >> CurrFishFileName; next; } # Trennzeilen mitzählen und skippen /^---+$/\ { TrennZeile++; next; } # Below-Zeilen mitzählen und skippen /^Below is a listing of the.*$/\ { BelowZeile++; next; } # Leerzeilen ins aktuelle ContentsXXX übernehmen /^[ \t]*$/\ { print >> CurrFishFileName; } # Folgezeile einer Programmbeschreibung # (fängt mit Tab(s) oder Space(s) an) /^[ \t]+.+$/\ { print >> CurrFishFileName; ThisProgramLines++; next; } # Erste Zeile einer Programmbeschreibung # (fängt nicht mit Tab(s) oder Space(s) an) /^[^ \t].+$/\ { PutLines(); printf " %s\r\x\23320C ", $1; ThisProgramLines=1; FoundPrograms++; ThisFishPrograms++; print >> CurrFishFileName; next; } # Schluß, Ende, Aus... END\ { if (FoundFishes>0) { PutPrograms(); # fehlen noch welche bis zum Ende der 'Dekade'? modulo = fishno % 10; if (modulo != 0) ShowMissing(fishno+1,fishno-modulo+10); # Statistik ausgeben printf "\n\n\n"; printf "Gefundene Fische:\t%d\n", FoundFishes; if (MissingFish>0) { printf "Fehlende Fische:\t%d (", MissingFish; for (n=0; n