Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! /bin/csh
- #
- # Meno: Slovik Michal, kr.8
- # Kruzok: 08
- # Datum: pripravne_csh (id: 2)
- # Zadanie: zadanie 14
- #
- # Text zadania:
- #
- # V zadanych textovych suboroch uvedenych ako argument najdite najdlhsi riadok
- # (riadky) zo vsetkych a vypiste ho (ich). Dlzka riadku je jeho dlzka v znakoch.
- # Ak nebude uvedenych ako argument ziadny subor, prehladava sa standardny vstup
- # (a jeho meno je -)
- #
- # Syntax:
- # zadanie1.csh [-h] [cesta ...]
- #
- # Vystup ma tvar:
- # Output: ‚<subor>: <cislo riadku v subore> <dlzka riadku> <riadok>‘
- #
- # Priklad vystupu (parametrami boli subory 123/deviaty druhy/meno/ nejaky v adresari /home/OS/test/test1):
- # Output: ‚123/deviaty: 1 178 6subor jednoducho... 123 subo2r ...‘
- # Output: ‚123/deviaty: 36 178subor jednoducho... 123 subor2r ...‘
- # Output: ‚druhy/meno/nejaky: 14 178 nejaky stvrty jednoducho... semtam stvrty ...‘
- # Program musi osetrovat pocet a spravnost argumentov. Program musi mat help, ktory
- # sa vypise pri zadani argumentu –h ma tvar:
- # Meno programu (C) meno autora
- #
- # Usage: <meno_programu> <arg1> <arg2> ...
- # <arg1>: xxxx
- # <arg2>:yyyyyy
- #
- # Parametre uvedene v <> treba nahradit skutocnymi hodnotami.
- # Ked ma skript prehladavat adresare, tak vzdy treba prehladavat vsetky zadane adresare
- # a vsetky ich podadresare do hlbky.
- # Pri hladani maxim alebo minim treba vzdy najst maximum(minimum) vo vsetkych zadanych adresaroch (suboroch) spolu. Ked viacero suborov (adresarov, ...)splna maximum (minimum), treba vypisat vsetky.
- #
- # Korektny vystup programu musi ist na standarny vystup (stdout).
- # Chybovy vystup programu by mal ist na chybovy vystup (stderr).
- # Chybovy vystup musi mat tvar (vratane apostrofov):
- # Error: ‚adresar, subor, ... pri ktorom nastala chyba‘: popis chyby...
- # Ak program pouziva nejake pomocne vypisy, musia mat tvar:
- # Debug: vypis ...
- # Poznamky:
- # Riesenie:
- set files = ()
- set tmpfile = "/tmp/$user.tmp.csh.txt"
- set isSetDebug = 0
- goto main
- help:
- echo "pripravne zadanie14 (C) Michal Slovik"
- echo ""
- echo "Usage: $0 [-h] [<file> ...]"
- echo "-h: print this help"
- echo "<file>: input file of which line(s) of max length is printed"
- echo " if there is no file(s) specified, program searches stdin for line(s) of max length"
- exit 0
- main:
- # spracuj argumenty prikazu
- while ( $#argv > 0 )
- # ak je zadany prepinac '-h'
- if ( "${1:q}" == "-h" ) then
- goto help
- exit 0
- else if ( "${1:q}" == "-d" ) then
- set isSetDebug = 1
- shift
- continue
- endif
- set files = ( $files:q ${1:q} )
- shift
- end # while $#argv > 0
- # spracovanie, ak nie je zadany ziaden subor na vstupe...
- # aby sme mali rovnake spracovanie pre vsetky pripady pouzitia programu
- # a) ak nie je zadany ziaden argument, pouzije sa stdin
- # b) ak je na mieste suboru uvedeny znak '-', znamena to stdin
- if ( $#files == 0 ) then
- set files = ( "-" )
- endif
- set linemax = -1 # nastavime globalne max na -1
- set rows = () # najdlhsie riadky budu v tomto poli
- # spracuj subory a/alebo stdin
- while ( $#files > 0 )
- if ( $isSetDebug == 1 ) then
- if ( "$files[1]:q" == "-" ) then
- echo "Debug: searching in 'STDIN'"
- else
- echo "Debug: searching in '$files[1]:q'"
- endif
- endif
- # vstup zo stdin si ulozime do pomocneho suboru
- set isSetStdin = 0
- if ( "$files[1]:q" == "-" ) then
- set isSetStdin = 1
- rm -rf $tmpfile
- while ( 1 )
- set line = "$<"
- if ( "$line:q" == "" ) then
- break
- endif
- echo "$line:q" >> $tmpfile
- end
- set files = ( "$tmpfile:q" $files[2-]:q )
- endif
- # ak subor nejestvuje, vypiseme chybovu hlasku a pokracujeme dalsim
- if ( ! -r "$files[1]:q" ) then
- echo "Error: ,$files[1]:q""': Can't read file or file doesn't exists"
- shift files
- continue
- endif
- # ak je vstupom STDIN, musime upravit nazov suboru, ktory sa bude vyskytovat
- # vo vystupe: jeho nazov je '-'
- set filename = "$files[1]:q"
- if ( $isSetStdin == 1 ) then
- set filename = "-"
- endif
- # musime na koniec kazdeho riadku dat znak dolaru... kvoli prazdnym riadkom
- set f = ( "`cat -E "'"$files[1]:q"'"`" )
- set linenum = 1
- set noglob
- while ( $linenum <= $#f )
- set line = "$f[$linenum]:q"
- #set line = "`echo "'"${line:q}"'" | rev | cut -b 2- | rev`"
- # odstranime z konca riadku znak dolara
- set line = "`echo "'"${line:q}"'" | sed '"'s/.$//'"'`"
- set linelen = `echo "'"$line:q"'" | wc -c`
- # z neznameho dovodu wc dava na vystupe o 3 znaky viac vsade
- # takze ich odpocitame...
- @ linelen = $linelen - 3
- if ( $linelen == $linemax ) then
- # ak mame dalsi riadok s rovnakou max. dlzkou
- set rows = ( $rows:q "Output: ,$filename:q"": $linenum $linemax ${line:q}'" )
- else if ( $linelen > $linemax ) then
- # ak je dlzka aktualneho riadku vacsia, mame nove maximum
- set linemax = $linelen
- set rows = ( "Output: ,$filename:q"": $linenum $linemax ${line:q}'" )
- endif
- @ linenum++
- end
- # zmaz docasny subor, ak bol pouzity
- if ( $isSetStdin == 1 ) then
- rm -rf "$tmpfile:q"
- endif
- shift files
- end
- # vypiseme najdlhsie riadky
- if ( $isSetDebug == 1 ) then
- echo Debug: pocet najdlhsich riadkov = $#rows
- endif
- while ( $#rows > 0 )
- echo "$rows[1]:q"
- shift rows
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement