Advertisement
Guest User

os_id2_14

a guest
Nov 26th, 2014
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.42 KB | None | 0 0
  1. #! /bin/csh
  2. #
  3. # Meno: Slovik Michal, kr.8
  4. # Kruzok: 08
  5. # Datum: pripravne_csh (id: 2)
  6. # Zadanie: zadanie 14
  7. #
  8. # Text zadania:
  9. #
  10. # V zadanych textovych suboroch uvedenych ako argument najdite najdlhsi riadok
  11. # (riadky) zo vsetkych a vypiste ho (ich). Dlzka riadku je jeho dlzka v znakoch.
  12. # Ak nebude uvedenych ako argument ziadny subor, prehladava sa standardny vstup
  13. # (a jeho meno je -)
  14. #
  15. # Syntax:
  16. # zadanie1.csh [-h] [cesta ...]
  17. #
  18. # Vystup ma tvar:
  19. # Output: ‚<subor>: <cislo riadku v subore> <dlzka riadku> <riadok>‘
  20. #
  21. # Priklad vystupu (parametrami boli subory 123/deviaty druhy/meno/ nejaky v adresari /home/OS/test/test1):
  22. # Output: ‚123/deviaty: 1 178 6subor jednoducho... 123 subo2r ...‘
  23. # Output: ‚123/deviaty: 36 178subor jednoducho... 123 subor2r ...‘
  24. # Output: ‚druhy/meno/nejaky: 14 178 nejaky stvrty jednoducho... semtam stvrty ...‘
  25.  
  26. # Program musi osetrovat pocet a spravnost argumentov. Program musi mat help, ktory
  27. # sa vypise pri zadani argumentu –h  ma tvar:
  28. # Meno programu (C) meno autora
  29. #
  30. # Usage: <meno_programu> <arg1> <arg2> ...
  31. #   <arg1>: xxxx
  32. #   <arg2>:yyyyyy
  33. #
  34. # Parametre uvedene v <> treba nahradit skutocnymi hodnotami.
  35. # Ked ma skript prehladavat adresare, tak vzdy treba prehladavat vsetky zadane adresare
  36. # a vsetky ich podadresare do hlbky.
  37. # 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.
  38. #
  39. # Korektny vystup programu musi ist na standarny vystup (stdout).
  40. # Chybovy vystup programu by mal ist na chybovy vystup (stderr).
  41. # Chybovy vystup musi mat tvar (vratane apostrofov):
  42. # Error: ‚adresar, subor, ... pri ktorom nastala chyba‘: popis chyby...
  43. # Ak program pouziva nejake pomocne vypisy, musia mat tvar:
  44. # Debug: vypis ...
  45.  
  46. # Poznamky:
  47. # Riesenie:
  48.  
  49. set files = ()
  50. set tmpfile = "/tmp/$user.tmp.csh.txt"
  51. set isSetDebug = 0
  52.  
  53. goto main
  54.  
  55. help:
  56.    echo "pripravne zadanie14 (C) Michal Slovik"
  57.    echo ""
  58.    echo "Usage: $0 [-h] [<file> ...]"
  59.    echo "-h: print this help"
  60.    echo "<file>: input file of which line(s) of max length is printed"
  61.    echo "        if there is no file(s) specified, program searches stdin for line(s) of max length"
  62.    exit 0
  63.  
  64. main:
  65. # spracuj argumenty prikazu
  66. while ( $#argv > 0 )
  67.    # ak je zadany prepinac '-h'
  68.    if ( "${1:q}" == "-h" ) then
  69.       goto help
  70.       exit 0
  71.    else if ( "${1:q}" == "-d" ) then
  72.       set isSetDebug = 1
  73.       shift
  74.       continue
  75.    endif
  76.  
  77.    set files = ( $files:q ${1:q} )
  78.  
  79.    shift
  80. end  # while $#argv > 0  
  81.  
  82. # spracovanie, ak nie je zadany ziaden subor na vstupe...
  83. # aby sme mali rovnake spracovanie pre vsetky pripady pouzitia programu
  84. # a) ak nie je zadany ziaden argument, pouzije sa stdin
  85. # b) ak je na mieste suboru uvedeny znak '-', znamena to stdin
  86. if ( $#files == 0 ) then
  87.    set files = ( "-" )
  88. endif
  89.  
  90. set linemax = -1  # nastavime globalne max na -1
  91. set rows = ()     # najdlhsie riadky budu v tomto poli
  92. # spracuj subory a/alebo stdin
  93. while ( $#files > 0 )
  94.    if ( $isSetDebug == 1 ) then
  95.       if ( "$files[1]:q" == "-" ) then
  96.          echo "Debug: searching in 'STDIN'"
  97.       else
  98.          echo "Debug: searching in '$files[1]:q'"
  99.       endif
  100.    endif
  101.  
  102.    # vstup zo stdin si ulozime do pomocneho suboru
  103.    set isSetStdin = 0
  104.    if ( "$files[1]:q" == "-" ) then
  105.       set isSetStdin = 1
  106.       rm -rf $tmpfile
  107.       while ( 1 )
  108.          set line = "$<"
  109.          if ( "$line:q" == "" ) then
  110.             break
  111.          endif
  112.          echo "$line:q" >> $tmpfile
  113.       end
  114.       set files = ( "$tmpfile:q" $files[2-]:q )
  115.    endif
  116.  
  117.    # ak subor nejestvuje, vypiseme chybovu hlasku a pokracujeme dalsim
  118.    if ( ! -r "$files[1]:q" ) then
  119.       echo "Error: ,$files[1]:q""': Can't read file or file doesn't exists"
  120.       shift files
  121.       continue
  122.    endif
  123.  
  124.    # ak je vstupom STDIN, musime upravit nazov suboru, ktory sa bude vyskytovat
  125.    # vo vystupe: jeho nazov je '-'
  126.    set filename = "$files[1]:q"
  127.    if ( $isSetStdin == 1 ) then
  128.       set filename = "-"
  129.    endif
  130.  
  131.    # musime na koniec kazdeho riadku dat znak dolaru... kvoli prazdnym riadkom
  132.    set f = ( "`cat -E  "'"$files[1]:q"'"`" )
  133.    set linenum = 1
  134.    set noglob
  135.    while ( $linenum <= $#f )
  136.       set line = "$f[$linenum]:q"
  137.       #set line = "`echo "'"${line:q}"'" | rev | cut -b 2- | rev`"
  138.       # odstranime z konca riadku znak dolara
  139.       set line = "`echo "'"${line:q}"'" | sed '"'s/.$//'"'`"
  140.       set linelen = `echo "'"$line:q"'" | wc -c`
  141.       # z neznameho dovodu wc dava na vystupe o 3 znaky viac vsade
  142.       # takze ich odpocitame...
  143.       @ linelen = $linelen - 3
  144.       if ( $linelen == $linemax ) then
  145.          # ak mame dalsi riadok s rovnakou max. dlzkou
  146.          set rows = ( $rows:q "Output: ,$filename:q"": $linenum $linemax ${line:q}'" )
  147.       else if ( $linelen > $linemax ) then
  148.          # ak je dlzka aktualneho riadku vacsia, mame nove maximum
  149.          set linemax = $linelen
  150.          set rows = ( "Output: ,$filename:q"": $linenum $linemax ${line:q}'" )
  151.       endif
  152.       @ linenum++
  153.    end
  154.  
  155.    # zmaz docasny subor, ak bol pouzity
  156.    if ( $isSetStdin == 1 ) then
  157.       rm -rf "$tmpfile:q"
  158.    endif
  159.  
  160.    shift files
  161. end
  162.  
  163. # vypiseme najdlhsie riadky
  164. if ( $isSetDebug == 1 ) then
  165.    echo Debug: pocet najdlhsich riadkov = $#rows
  166. endif  
  167. while ( $#rows > 0 )
  168.    echo "$rows[1]:q"
  169.    shift rows
  170. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement