"Fossies" - the Fresh Open Source Software Archive

Member "gawk-5.1.0/doc/it/gawktexi.in" (13 Apr 2020, 1907119 Bytes) of package /linux/misc/gawk-5.1.0.tar.xz:


As a special service "Fossies" has tried to format the requested text file into HTML format (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file.

    1 \language=30
    2 \input texinfo   @c -*-texinfo-*-
    3 @c vim: filetype=texinfo
    4 @c %**start of header (This is for running Texinfo on a region.)
    5 @setfilename gawk-it.info
    6 @settitle Guida Utente di GNU Awk
    7 @documentlanguage it
    8 @c %**end of header (This is for running Texinfo on a region.)
    9 
   10 @dircategory Creazione e manipolazione di testi
   11 @direntry
   12 * Gawk: (gawk).                 Un linguaggio per scandire ed elaborare testi.
   13 @end direntry
   14 @dircategory Programmi di utilit@`a individuale
   15 @direntry
   16 * awk: (gawk)Avviare Gawk.                     Scansione e processo di testi.
   17 @end direntry
   18 
   19 @ifset FOR_PRINT
   20 @tex
   21 \gdef\xrefprintnodename#1{``#1''}
   22 @end tex
   23 @end ifset
   24 
   25 @ifclear FOR_PRINT
   26 @c With early 2014 texinfo.tex, restore PDF links and colors
   27 @tex
   28 \gdef\linkcolor{0.5 0.09 0.12} % Dark Red
   29 \gdef\urlcolor{0.5 0.09 0.12} % Also
   30 \global\urefurlonlylinktrue
   31 @end tex
   32 @end ifclear
   33 
   34 @ifnotdocbook
   35 @set BULLET @bullet{}
   36 @set MINUS @minus{}
   37 @end ifnotdocbook
   38 
   39 @ifdocbook
   40 @set BULLET
   41 @set MINUS
   42 @end ifdocbook
   43 
   44 @iftex
   45 @set VOLTE @times
   46 @end iftex
   47 @ifnottex
   48 @set VOLTE *
   49 @end ifnottex
   50 
   51 @c Let texinfo.tex give us full section titles
   52 @xrefautomaticsectiontitle on
   53 
   54 @c The following information should be updated here only!
   55 @c This sets the edition of the document, the version of gawk it
   56 @c applies to and all the info about who's publishing this edition
   57 
   58 @c These apply across the board.
   59 @set UPDATE-MONTH Marzo 2020
   60 @set VERSION 5.1
   61 @set PATCHLEVEL 0
   62 
   63 @c added Italian hyphenation stuff
   64 @hyphenation{ven-go-no o-met-te-re o-met-ten-do}
   65 
   66 @set GAWKINETTITLE TCP/IP Internetworking with @command{gawk}
   67 @ifset FOR_PRINT
   68 @set TITLE Programmare efficacemente in awk
   69 @end ifset
   70 @ifclear FOR_PRINT
   71 @set TITLE GAWK: Programmare efficacemente in AWK
   72 @end ifclear
   73 @set SUBTITLE Una Guida Utente per GNU Awk
   74 @set EDITION 5.1
   75 
   76 @iftex
   77 @set DOCUMENT libro
   78 @set CHAPTER capitolo
   79 @set APPENDIX appendice
   80 @set SECTION sezione
   81 @set SECTIONS sezioni
   82 @set SUBSECTION sottosezione
   83 @set SUBSECTIONS sottosezioni
   84 @ifclear SMALLPRINT
   85 @set DARKCORNER @inmargin{@image{lflashlight,1cm}, @image{rflashlight,1cm}}
   86 @end ifclear
   87 @ifset SMALLPRINT
   88 @set DARKCORNER @inmargin{@image{lflashlight,0.7cm}, @image{rflashlight,0.7cm}}
   89 @end ifset
   90 @set COMMONEXT (e.c.)
   91 @set PAGE pagina
   92 @end iftex
   93 @ifinfo
   94 @set DOCUMENT File Info
   95 @set CHAPTER nodo principale
   96 @set APPENDIX nodo principale
   97 @set SECTION nodo secondario
   98 @set SECTIONS nodi secondari
   99 @set SUBSECTION nodo
  100 @set SUBSECTIONS nodi
  101 @set DARKCORNER (a.b.)
  102 @set COMMONEXT (e.c.)
  103 @set PAGE videata
  104 @end ifinfo
  105 @ifhtml
  106 @set DOCUMENT Documento
  107 @set CHAPTER capitolo
  108 @set APPENDIX appendice
  109 @set SECTION sezione
  110 @set SECTIONS sezioni
  111 @set SUBSECTION sottosezione
  112 @set SUBSECTIONS sottosezioni
  113 @set DARKCORNER (a.b.)
  114 @set COMMONEXT (e.c.)
  115 @set PAGE videata
  116 @end ifhtml
  117 @ifdocbook
  118 @set DOCUMENT libro
  119 @set CHAPTER capitolo
  120 @set APPENDIX appendice
  121 @set SECTION sezione
  122 @set SECTIONS sezioni
  123 @set SUBSECTION sottosezione
  124 @set SUBSECTIONS sottosezioni
  125 @set DARKCORNER (a.b.)
  126 @set COMMONEXT (e.c.)
  127 @set PAGE pagina
  128 @end ifdocbook
  129 @ifxml
  130 @set DOCUMENT libro
  131 @set CHAPTER capitolo
  132 @set APPENDIX appendice
  133 @set SECTION sezione
  134 @set SECTIONS sezioni
  135 @set SUBSECTION sottosezione
  136 @set SUBSECTIONS sottosezioni
  137 @set DARKCORNER (a.b.)
  138 @set COMMONEXT (e.c.)
  139 @set PAGE pagina
  140 @end ifxml
  141 @ifplaintext
  142 @set DOCUMENT libro
  143 @set CHAPTER capitolo
  144 @set APPENDIX appendice
  145 @set SECTION sezione
  146 @set SECTIONS sezioni
  147 @set SUBSECTION sottosezione
  148 @set SUBSECTIONS sottosezioni
  149 @set DARKCORNER (a.b.)
  150 @set COMMONEXT (e.c.)
  151 @set PAGE pagina
  152 @end ifplaintext
  153 
  154 @ifdocbook
  155 @c empty on purpose
  156 @set PART1
  157 @set PART2
  158 @set PART3
  159 @set PART4
  160 @end ifdocbook
  161 
  162 @ifnotdocbook
  163 @set PART1 Parte I:@*
  164 @set PART2 Parte II:@*
  165 @set PART3 Parte III:@*
  166 @set PART4 Parte IV:@*
  167 @end ifnotdocbook
  168 
  169 @c some special symbols
  170 @iftex
  171 @set LEQ @math{@leq}
  172 @set PI @math{@pi}
  173 @end iftex
  174 @ifdocbook
  175 @set LEQ @inlineraw{docbook, ≤}
  176 @set PI @inlineraw{docbook, &pgr;}
  177 @end ifdocbook
  178 @ifnottex
  179 @ifnotdocbook
  180 @set LEQ <=
  181 @set PI @i{pi}
  182 @end ifnotdocbook
  183 @end ifnottex
  184 
  185 @ifnottex
  186 @ifnotdocbook
  187 @macro ii{text}
  188 @i{\text\}
  189 @end macro
  190 @end ifnotdocbook
  191 @end ifnottex
  192 
  193 @ifdocbook
  194 @macro ii{text}
  195 @inlineraw{docbook,<lineannotation>\text\</lineannotation>}
  196 @end macro
  197 @end ifdocbook
  198 
  199 @ifclear FOR_PRINT
  200 @set FN nome-file
  201 @set FFN Nome-file
  202 @c for Italian plurals {FN}s
  203 @set FNS nomi-file
  204 @set FFNS Nomi-file
  205 @set DF file-dati
  206 @set DDF File-dati
  207 @set PVERSION versione
  208 @end ifclear
  209 @ifset FOR_PRINT
  210 @set FN nome-file
  211 @set FFN Nome-File
  212 @c for Italian plurals {FN}s
  213 @set FNS nomi-file
  214 @set FFNS Nomi-file
  215 @set DF file-dati
  216 @set DDF File-dati
  217 @set PVERSION Versione
  218 @end ifset
  219 
  220 @c For HTML, spell out email addresses, to avoid problems with
  221 @c address harvesters for spammers.
  222 @ifhtml
  223 @macro EMAIL{real,spelled}
  224 ``\spelled\''
  225 @end macro
  226 @end ifhtml
  227 @ifnothtml
  228 @macro EMAIL{real,spelled}
  229 @email{\real\}
  230 @end macro
  231 @end ifnothtml
  232 
  233 @c Indexing macros
  234 @ifinfo
  235 
  236 @macro cindexawkfunc{name}
  237 @cindex @code{\name\}
  238 @end macro
  239 
  240 @macro cindexgawkfunc{name}
  241 @cindex @code{\name\}
  242 @end macro
  243 
  244 @end ifinfo
  245 
  246 @ifnotinfo
  247 
  248 @macro cindexawkfunc{name}
  249 @cindex @code{\name\()} (funzione)
  250 @end macro
  251 
  252 @macro cindexgawkfunc{name}
  253 @cindex @code{\name\()} (funzione @command{gawk})
  254 @end macro
  255 @end ifnotinfo
  256 
  257 @ignore
  258 Some comments on the layout for TeX.
  259 1. Use at least texinfo.tex 2016-02-05.07.
  260 @end ignore
  261 
  262 @c merge the function and variable indexes into the concept index
  263 @ifinfo
  264 @synindex fn cp
  265 @synindex vr cp
  266 @end ifinfo
  267 @iftex
  268 @syncodeindex fn cp
  269 @syncodeindex vr cp
  270 @end iftex
  271 @ifxml
  272 @syncodeindex fn cp
  273 @syncodeindex vr cp
  274 @end ifxml
  275 @ifdocbook
  276 @synindex fn cp
  277 @synindex vr cp
  278 @end ifdocbook
  279 
  280 @c If "finalout" is commented out, the printed output will show
  281 @c black boxes that mark lines that are too long.  Thus, it is
  282 @c unwise to comment it out when running a master in case there are
  283 @c overfulls which are deemed okay.
  284 
  285 @iftex
  286 @finalout
  287 @end iftex
  288 
  289 @c Enabled '-quotes in PDF files so that cut/paste works in
  290 @c more places.
  291 
  292 @codequoteundirected on
  293 @codequotebacktick on
  294 
  295 @copying
  296 @docbook
  297 <para>
  298 &ldquo;To boldly go where no man has gone before&rdquo;
  299 (&ldquo;Per arrivare l@`a dove nessun uomo @`e mai giunto prima&rdquo;)
  300 @`e un Marchio Registrato della Paramount Pictures Corporation.</para>
  301 
  302 <para>Titolo originale:</para>
  303 @b{Gawk: Effective AWK Programming}@*
  304 @i{A User's Guide for GNU Awk}
  305 
  306 <para>Published by:</para>
  307 <literallayout class="normal">Free Software Foundation
  308 51 Franklin Street, Fifth Floor -- Boston, MA  02110-1301 USA
  309 Tel.: +1-617-542-5942 Fax: +1-617-542-2652 Email: <email>gnu@@gnu.org</email>
  310 URL: <ulink url="https://www.gnu.org">https://www.gnu.org/</ulink></literallayout>
  311 
  312 <literallayout class="normal">Copyright &copy; 1989, 1991, 1992, 1993, 1996&ndash;2005, 2007, 2009&ndash;2020
  313 Free Software Foundation, Inc.
  314 All Rights Reserved.
  315 </literallayout>
  316 
  317 </para>Traduzione e revisione:<para>
  318 <literallayout class="normal">
  319 Antonio Giovanni Colombo -- <email>azc100(chiocciola)gmail(punto)com</email>
  320 Marco Curreli -- <email>marcocurreli(chiocciola)tiscali(punto)it</email>
  321 (Italian Linux Documentation Project (<ulink url="http://www.pluto.it/ildp">http://www.pluto.it/ildp/</ulink>)
  322 </literallayout>
  323 
  324 <para>Pubblicato da:</para>
  325 <literallayout class="normal">Free Software Foundation
  326 Email: <email>gnu@@gnu.org</email>
  327 URL: <ulink url="https://www.gnu.org">https://www.gnu.org/</ulink>
  328 
  329 e da:
  330 Italian Linux Documentation Project (ILDP)
  331 Email: <emailildp@@pluto.it
  332 URL: <ulink url="http://www.pluto.it/ildp">http://www.pluto.it/ildp/</ulink></literallayout>
  333 
  334 <literallayout class="normal">Copyright &copy; 2016&ndash;2020
  335 Free Software Foundation, Inc.
  336 All Rights Reserved.
  337 </literallayout>
  338 @end docbook
  339 
  340 @ifnotdocbook
  341 @iftex
  342 Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2020 @*
  343 Free Software Foundation, Inc.
  344 @end iftex
  345 @end ifnotdocbook
  346 @sp 2
  347 Questa @`e l'Edizione @value{EDITION} di @cite{@value{TITLE}: @value{SUBTITLE}},
  348 per la versione @value{VERSION}.@value{PATCHLEVEL} (o successiva)
  349 dell'implementazione GNU di AWK.
  350 @ifnottex
  351 @ifnotxml
  352 @ifnotdocbook
  353 (Titolo originale: @i{Gawk: Effective AWK Programming: A User's Guide for GNU Awk.)}
  354 @end ifnotdocbook
  355 @end ifnotxml
  356 @end ifnottex
  357 
  358 @`E garantito il permesso di copiare, distribuire e/o modificare questo
  359 documento seguendo i termini della Licenza per Documentazione Libera
  360 GNU, Versione 1.3 o ogni versione successiva pubblicata dalla Free
  361 Software Foundation; con le Sezioni Non Modificabili ``GNU General
  362 Public License'', con i testi di copertina ``Un Manuale GNU'', e con i
  363 testi di quarta di copertina come in (a) pi@`u avanti.
  364 @ifclear FOR_PRINT
  365 Una copia della licenza @`e acclusa nella sezione intitolata
  366 "Licenza per Documentazione Libera GNU".
  367 @end ifclear
  368 @ifset FOR_PRINT
  369 Una copia della licenza
  370 si pu@`o trovare in internet all'indirizzo
  371 @uref{https://www.gnu.org/software/gawk/manual/html_node/GNU-Free-Documentation-License.html,
  372 il sito web del Progetto GNU}.
  373 @end ifset
  374 
  375 @enumerate a
  376 @item
  377 Il testo di quarta di copertina della FSF @`e: ``@`E garantito il permesso di
  378 copiare e modificare questo manuale GNU.''
  379 @end enumerate
  380 @end copying
  381 
  382 @c Comment out the "smallbook" for technical review.  Saves
  383 @c considerable paper.  Remember to turn it back on *before*
  384 @c starting the page-breaking work.
  385 
  386 @c 4/2002: Karl Berry recommends commenting out this and the
  387 @c `@setchapternewpage odd', and letting users use `texi2dvi -t'
  388 @c if they want to waste paper.
  389 @c @smallbook
  390 
  391 
  392 @c Uncomment this for the release.  Leaving it off saves paper
  393 @c during editing and review.
  394 @setchapternewpage odd
  395 
  396 @shorttitlepage GNU Awk
  397 @titlepage
  398 @title @value{TITLE}
  399 @subtitle @value{SUBTITLE}
  400 @subtitle Edizione @value{EDITION}
  401 @subtitle @value{UPDATE-MONTH}
  402 @author Arnold D. Robbins
  403 
  404 @ifnotdocbook
  405 @c Include the Distribution inside the titlepage environment so
  406 @c that headings are turned off.  Headings on and off do not work.
  407 
  408 @page
  409 @vskip 0pt plus 1filll
  410 ``To boldly go where no man has gone before''
  411 (``Per arrivare l@`a dove nessun uomo @`e mai giunto prima'')
  412 @`e un Marchio Registrato della Paramount Pictures Corporation. @*
  413 @c sorry, i couldn't resist
  414 @sp 1
  415 Titolo originale:@*
  416 @b{Gawk: Effective AWK Programming}@*
  417 @i{A User's Guide for GNU Awk}
  418 @sp 0
  419 Published by @strong{Free Software Foundation}@*
  420 51 Franklin Street, Fifth Floor -- Boston, MA  02110-1301 USA @*
  421 Tel.: +1-617-542-5942 -- Fax: +1-617-542-2652 -- Email: @email{gnu@@gnu.org} @*
  422 URL: @uref{https://www.gnu.org/}
  423 @sp 0
  424 @c This one is correct for gawk 3.1.0 from the FSF
  425 ISBN 1-882114-28-0
  426 @sp 0
  427 Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2018 @*
  428 Free Software Foundation, Inc.
  429 @sp 1
  430 Traduzione e revisione:@*
  431 Antonio Giovanni Colombo -- @email{azc100(chiocciola)gmail(punto)com}@*
  432 Marco Curreli -- @email{marcocurreli(chiocciola)tiscali(punto)it}@*
  433 (Italian Linux Documentation Project -- @uref{http://www.pluto.it/ildp})
  434 @sp 1
  435 Pubblicato da:
  436 Free Software Foundation@*
  437 Email: @email{gnu@@gnu.org}; URL: @uref{https://www.gnu.org/}
  438 
  439 e da:
  440 Italian Linux Documentation Project (ILDP)@*
  441 Email: @email{ildp@@pluto.it}; URL: @uref{http://www.pluto.it/ildp}
  442 
  443 @insertcopying
  444 @sp 1
  445 @end ifnotdocbook
  446 @end titlepage
  447 
  448 @c Thanks to Bob Chassell for directions on doing dedications.
  449 @iftex
  450 @headings off
  451 @page
  452 @w{ }
  453 @sp 9
  454 
  455 @ifclear SMALLPRINT
  456 @center @i{Ai miei genitori, per il loro amore, e per lo splendido esempio che mi hanno dato.}
  457 @sp 1
  458 @center @i{A mia moglie, Miriam, per avermi reso completo.
  459 Grazie per aver costruito la tua vita insieme a me.}
  460 @sp 1
  461 @center @i{Ai nostri figli, Chana, Rivka, Nachum e Malka, per aver arricchito le nostre vite in misura incalcolabile.}
  462 @end ifclear
  463 
  464 @ifset SMALLPRINT
  465 @center @i{Ai miei genitori, per il loro amore,}
  466 @center @i{ e per lo splendido esempio che mi hanno dato.}
  467 @sp 1
  468 @center @i{A mia moglie, Miriam, per avermi reso completo.} @*
  469 @center @i{ Grazie per aver costruito la tua vita insieme a me.}
  470 @sp 1
  471 @center @i{Ai nostri figli, Chana, Rivka, Nachum e Malka,}
  472 @center @i{per aver arricchito le nostre vite in misura incalcolabile.}
  473 @end ifset
  474 
  475 @sp 1
  476 @w{ }
  477 @page
  478 @w{ }
  479 @page
  480 @headings on
  481 @end iftex
  482 
  483 @docbook
  484 <dedication>
  485 <para>Ai miei genitori, per il loro amore, e per lo splendido
  486 esempio che mi hanno dato.</para>
  487 <para>A mia moglie Miriam, per avermi reso completo.
  488 Grazie per aver costruito la tua vita insieme con me.</para>
  489 <para>Ai nostri figli Chana, Rivka, Nachum e Malka,
  490 per aver arricchito le nostre vite in misura incalcolabile.</para>
  491 </dedication>
  492 @end docbook
  493 
  494 @iftex
  495 @headings off
  496 @evenheading @thispage@ @ @ @strong{@value{TITLE}} @| @|
  497 @oddheading  @| @| @strong{@thischapter}@ @ @ @thispage
  498 @end iftex
  499 
  500 @ifnottex
  501 @ifnotxml
  502 @ifnotdocbook
  503 @node Top
  504 @top Introduzione Generale
  505 @c Preface node should come right after the Top
  506 @c node, in `unnumbered' sections, then the chapter, `What is gawk'.
  507 @c Licensing nodes are appendices, they're not central to AWK.
  508 
  509 Questo file documenta @command{awk}, un programma che si pu@`o usare per
  510 selezionare dei record determinati in un file ed eseguire azioni su di essi.
  511 
  512 @noindent
  513 Copyright dell'edizione originale @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2018 @*
  514 Free Software Foundation, Inc.
  515 
  516 @noindent
  517 Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, Inc.
  518 
  519 
  520 @insertcopying
  521 
  522 @end ifnotdocbook
  523 @end ifnotxml
  524 @end ifnottex
  525 
  526 @menu
  527 * Introduzione3::                  Alcune parole gentili riguardo a questo
  528                                    @value{DOCUMENT}.
  529 * Introduzione4::                  Ulteriori parole gentili.
  530 * Prefazione::                     Di cosa tratta questo @value{DOCUMENT};
  531                                    breve storia e ringraziamenti.
  532 * Per iniziare::                   Un'introduzione elementare all'uso di
  533                                    @command{awk}. Come eseguire un programma
  534                                    @command{awk}. Sintassi della riga di
  535                                    comando.
  536 * Invocare Gawk::                  Come eseguire @command{gawk}.
  537 * Espressioni regolari::           Tutto quel che c'@`e da sapere
  538                                    sull'individuazione di stringhe tramite
  539                                    espressioni regolari.
  540 * Leggere file::                   Come leggere file e manipolare campi.
  541 * Stampare::                       Come stampare usando @command{awk}.
  542                                    Descrizione delle istruzioni @code{print} e
  543                                    @code{printf}. @`E descritta inoltre la
  544                                    ridirezione dell'output.
  545 * Espressioni::                    Le espressioni sono i componenti elementari
  546                                    delle istruzioni.
  547 * Criteri di ricerca e azioni::    Panoramica sui criteri di ricerca e sulle
  548                                    azioni.
  549 * Vettori::                        La descrizione e l'uso dei vettori. Sono
  550                                    inoltre descritte le istruzioni di controllo
  551                                    relative ai vettori.
  552 * Funzioni::                       Funzioni predefinite e definite dall'utente.
  553 * Funzioni di libreria::           Una libreria di funzioni di @command{awk}.
  554 * Programmi di esempio::           Molti programmi @command{awk} con
  555                                    spiegazioni dettagliate.
  556 * Funzionalit@`a avanzate::          Roba per utenti sofisticati, propria di
  557                                    @command{gawk}.
  558 * Internazionalizzazione::         Come far s@`{@dotless{i}} che @command{gawk} parli la
  559                                    vostra lingua.
  560 * Debugger::                       Il debugger di @command{gawk}.
  561 * Spazi-dei-nomi::                      Come funzionano gli spazi-dei-nomi
  562                                    (@dfn{spazi-dei-nomi}) in @command{gawk}.
  563 * Calcolo con precisione arbitraria:: Calcolo con precisione arbitraria in
  564                                    @command{gawk}.
  565 * Estensioni dinamiche::           Aggiungere nuove funzioni predefinite di
  566                                    @command{gawk}.
  567 * Storia del linguaggio::          L'evoluzione del linguaggio @command{awk}.
  568 * Installazione::                  Installare @command{gawk} in vari sistemi
  569                                    operativi.
  570 * Note::                           Note riguardo ad aggiunte a @command{gawk}
  571                                    e possibili futuri sviluppi.
  572 * Concetti fondamentali::          Velocissima introduzione alla
  573                                    programmazione.
  574 * Glossario::                      Spiegazione di alcuni termini poco
  575                                    familiari.
  576 * Copia::                          Il vostro diritto a copiare e distribuire
  577                                    @command{gawk}.
  578 * Licenza per Documentazione Libera GNU (FDL):: La licenza per questo
  579                                    @value{DOCUMENT}.
  580 * Indice analitico::               Indice dei concetti e delle variabili.
  581 
  582 @detailmenu
  583 * Storia::                              La storia di @command{gawk} e
  584                                         @command{awk}.
  585 * Nomi::                                Che nome usare per trovare
  586                                         @command{awk}.
  587 * Questo manuale::                      Uso di questo @value{DOCUMENT}.
  588                                         Comprende esempi di file in input
  589                                         utilizzabili.
  590 * Convenzioni::                         Convenzioni tipografiche.
  591 * Storia del manuale::                  Breve storia del progetto GNU e di
  592                                         questo @value{DOCUMENT}.
  593 * Come contribuire::                    Un aiuto per la salvezza del mondo.
  594 * Ringraziamenti::                      Ringraziamenti.
  595 * Eseguire gawk::                       Come eseguire programmi
  596                                         @command{gawk}; comprende la sintassi
  597                                         della riga di comando.
  598 * Monouso::                             Eseguire un breve programma
  599                                         @command{awk} di tipo usa-e-getta.
  600 * Leggere dal terminale::               Senza uso di file in input (input
  601                                         immesso da tastiera).
  602 * Lunghi::                              Mettere programmi @command{awk}
  603                                         permanenti in file.
  604 * @dfn{Script} eseguibili::             Preparare programmi @command{awk}
  605                                         da eseguire come @dfn{script}.
  606 * Commenti::                            Aggiungere documentazione a programmi
  607                                         @command{gawk}.
  608 * Protezione::                          Ulteriore discussione di problemi
  609                                         connessi alle protezioni nella shell.
  610 * Doppi apici in DOS::                  Doppi apici in file .BAT Windows
  611 * File dati di esempio::                File di dati di esempio da usare nei
  612                                         programmi @command{awk} illustrati in
  613                                         questo @value{DOCUMENT}.
  614 * Molto semplice::                      Un esempio molto semplice.
  615 * Due regole::                          Un esempio meno semplice di programma
  616                                         di una riga, che usa due regole.
  617 * Maggiore sofisticazione::             Un esempio pi@`u complesso.
  618 * Istruzioni/Righe::                    Suddividere o riunire istruzioni
  619                                         su [una o pi@`u] righe.
  620 * Altre funzionalit@`a::                  Altre funzionalit@`a di @command{awk}.
  621 * Quando::                              Quando usare @command{gawk} e quando
  622                                         usare altre cose.
  623 * Sommario dell'introduzione::          Sommario dell'introduzione.
  624 * Riga di comando::                     Come eseguire @command{awk}.
  625 * Opzioni::                             Opzioni sulla riga di comando e loro
  626                                         significato.
  627 * Altri argomenti::                     Nomi dei file in input e assegnamento
  628                                         di valori a variabili.
  629 * Specificare lo standard input::       Come specificare lo standard input
  630                                         insieme ad altri file.
  631 * Variabili d'ambiente::                Le variabili d'ambiente usate da
  632                                         @command{gawk}.
  633 * AWKPATH (Variabile)::                 Ricerca di programmi @command{awk}
  634                                         in una lista di directory.
  635 * AWKLIBPATH (Variabile)::              Ricerca di librerie condivise
  636                                         @command{awk} in una lista di
  637                                         directory.
  638 * Altre variabili d'ambiente::          Le variabili d'ambiente.
  639 * Codice di ritorno::                   Il codice di ritorno all'uscita
  640                                         da @command{gawk}.
  641 * Includere file::                      Come includere altri file nel
  642                                         proprio programma.
  643 * Caricare librerie condivise::         Caricare librerie condivise nel
  644                                         proprio programma.
  645 * Parti obsolete::                      Opzioni e/o funzionalit@`a obsolete.
  646 * Non documentato::                     Opzioni e funzionalit@`a non documentate.
  647 * Sommario invocazione::                Sommario di come eseguire
  648                                         @command{awk}.
  649 * Uso di @dfn{regexp}::                 Come usare le espressioni regolari.
  650 * Sequenze di protezione::              Come scrivere caratteri non stampabili.
  651 * Operatori di espressioni regolari::   Operatori di espressioni regolari.
  652 * Dettagli sugli operatori di @dfn{regexp}:: Descrizione dettagliata.
  653 * Espressioni di intervallo::           Note sulle espressioni di intervallo.
  654 * Espressioni tra parentesi quadre::    Cosa possono contenere @samp{[...]}.
  655 * Pi@`u lungo da sinistra::               Quanto @`e lungo il testo individuato.
  656 * Espressioni regolari calcolate::      Usare @dfn{regexp} dinamiche.
  657 * Operatori di @dfn{regexp} GNU::       Operatori propri del software GNU.
  658 * Maiuscolo-Minuscolo::                 Fare confronti ignorando
  659                                         maiuscolo/minuscolo.
  660 * Sommario espressioni regolari::       Sommario delle espressioni regolari.
  661 * Record::                              Controllare come i dati sono suddivisi
  662                                         in record.
  663 * awk divisione record::                Divisione dei record con @command{awk}
  664                                         standard.
  665 * gawk divisione record::               Divisione dei record con @command{gawk}.
  666 * Campi::                               Un'introduzione ai campi.
  667 * Campi non costanti::                  Numeri di campo variabili.
  668 * Cambiare i campi::                    Cambiare il contenuto di un campo.
  669 * Separatori di campo::                 I separatori di campo, e come
  670                                         cambiarli.
  671 * Separatori di campo di default::      Come di solito sono separati i campi.
  672 * Separare campi con @dfn{regexp}::     Usare @dfn{regexp} come separatori.
  673 * Campi di un solo carattere::          Fare di ogni carattere un campo
  674                                         separato.
  675 * Separatori campo da riga di comando:: Impostare @code{FS} dalla riga di
  676                                         comando.
  677 * Campo intera riga::                   Fare di una riga intera un campo
  678                                         solo.
  679 * Sommario sulla separazione campi::    Alcuni punti finali e una tavola di
  680                                         sommario.
  681 * Dimensione costante::                 Leggere campi di larghezza costante.
  682 * Dati di lunghezza fissa::             Elaborare dati di lunghezza fissa.
  683 * Saltare campi intermedi::             Saltare campi intermedi.
  684 * Consentire dati a fine record::       Trattare dati opzionali a fine record.
  685 * Campi con dati a larghezza fissa::    Valore di campi con dati a larghezza
  686                                         fissa.
  687 * Separazione in base al contenuto::    Definire campi dal loro contenuto.
  688 * File CSV::                            Ancora sui file CSV.
  689 * Controllare la creazione di campi::   Controllare come @command{gawk} sta
  690                                         dividendo i record.
  691 * Righe multiple::                      Record su righe multiple
  692 * Getline::                             Richiedere input usando @code{getline}.
  693 * Getline semplice::                    Usare @code{getline} senza argomenti.
  694 * Getline variabile::                   Usare @code{getline} in una variabile.
  695 * Getline file::                        Usare @code{getline} da un file.
  696 * Getline variabile file::              Usare @code{getline} in una variabile
  697                                         da un file.
  698 * Getline @dfn{pipe}::                  Usare @code{getline} da una @dfn{pipe}.
  699 * Getline variabile @dfn{pipe}::        Usare @code{getline} in una variabile
  700                                         da una @dfn{pipe}.
  701 * Getline coprocesso::                  Usare @code{getline} da un coprocesso.
  702 * Getline variabile coprocesso::        Usare @code{getline} in una variabile
  703                                         da un coprocesso.
  704 * Note su getline::                     Cose importanti da sapere su
  705                                         @code{getline}.
  706 * Sommario di getline::                 Sommario delle varianti di
  707                                         @code{getline}.
  708 * Timeout in lettura::                  Leggere input entro un tempo limite.
  709 * Proseguire dopo errore in input::     Rielaborare input dopo certi errori.
  710 * Directory su riga di comando::        Cosa accade se si mette una directory
  711                                         sulla riga di comando.
  712 * Sommario di Input::                   Sommario di Input.
  713 * Esercizi su Input::                   Esercizi.
  714 * Print::                               L'istruzione @code{print}.
  715 * Esempi su print::                     Semplici esempi di
  716                                         istruzioni @code{print}.
  717 * Separatori di output::                I separatori di output e come
  718                                         modificarli.
  719 * OFMT::                                Controllare l'output di numeri con
  720                                         @code{print}.
  721 * Printf::                              L'istruzione @code{printf}.
  722 * Printf Fondamenti::                   Sintassi dell'istruzione
  723                                         @code{printf}.
  724 * Lettere di controllo::                Lettere di controllo del formato.
  725 * Modificatori di formato::             Modificatori specifiche di formato.
  726 * Esempi su printf::                    Numerosi esempi.
  727 * Ridirezione::                         Come ridirigere l'output a diversi
  728                                         file e @dfn{pipe}.
  729 * FD speciali::                         File speciali per I/O.
  730 * File speciali::                       Interpretazione @value{FNS} in
  731                                         @command{gawk}. @command{gawk}
  732                                         permette di accedere a descrittori di
  733                                         file ereditati.
  734 * Altri file ereditati::                Accedere ad altri file aperti con
  735                                         @command{gawk}.
  736 * Reti speciali::                       File speciali per comunicazioni con
  737                                         la rete.
  738 * Avvertimenti speciali::               Cose a cui prestare attenzione.
  739 * Chiusura file e @dfn{pipe}::          Chiudere file in input e di output e
  740                                         @dfn{pipe}.
  741 * Continuazione dopo errori::           Abilitare continuazione dopo errori
  742                                         in output.
  743 * Sommario di Output::                  Sommario di Output.
  744 * Esercizi su Output::                  Esercizi.
  745 * Valori::                              Costanti, variabili ed espressioni
  746                                         regolari.
  747 * Costanti::                            Costanti di tipo stringa, numeriche ed
  748                                         espressioni regolari.
  749 * Costanti scalari::                    Costanti numeriche e stringhe.
  750 * Numeri non-decimali::                 Cosa sono i numeri ottali ed
  751                                         esadecimali.
  752 * Costanti come espressioni regolari::  Costanti fornite tramite espressioni
  753                                         regolari.
  754 * Usare le costanti @dfn{regexp}::      Quando e come usare una costante
  755                                         specificata tramite espressioni
  756                                         regolari
  757 * Costanti @dfn{regexp} normali::       Costanti @dfn{regexp} normali in
  758                                         @command{awk}.
  759 * Costanti @dfn{regexp} forti::         Costanti @dfn{regexp} fortemente
  760                                         tipizzate.
  761 * Variabili::                           Le variabili permettono di
  762                                         definire valori da usare in seguito.
  763 * Usare variabili::                     Usare variabili nei propri programmi.
  764 * Opzioni di assegnamento::             Impostare variabili dalla riga di
  765                                         comando, e un sommario della sintassi
  766                                         della riga di comando.
  767                                         Questo @`e un metodo di input avanzato.
  768 * Conversione::                         La conversione di stringhe in numeri
  769                                         e viceversa.
  770 * Stringhe e numeri::                   Come @command{awk} converte tra
  771                                         stringhe e numeri.
  772 * Localizzazione e conversioni::        Come la localizzazione pu@`o influire
  773                                         sulle conversioni.
  774 * Tutti gli operatori::                 Gli operatori di @command{gawk}.
  775 * Operatori aritmetici::                Operazioni aritmetiche (@samp{+},
  776                                         @samp{-}, etc.)
  777 * Concatenazione::                      Concatenazione di stringhe.
  778 * Operatori di assegnamento::           Cambiare il valore di una variabile
  779                                         o di un campo.
  780 * Operatori di incremento::             Incrementare il valore numerico di una
  781                                         variabile.
  782 * Valori e condizioni di verit@`a::       Determinare Vero/Falso.
  783 * Valori di verit@`a::                    Cosa @`e ``vero'' e cosa @`e ``falso''.
  784 * Tipi di variabile e confronti::       Come alle variabili si assegna il tipo
  785                                         e l'effetto che questo ha sul confronto
  786                                         di numeri e stringhe con @samp{<}, etc.
  787 * Tipi di variabile::                   Tipo stringa rispetto a tipo numero.
  788 * Operatori di confronto::              Gli operatori di confronto.
  789 * Confronto POSIX di stringhe::         Confronto tra stringhe usando le
  790                                         regole POSIX.
  791 * Operatori booleani::                  Combinare espressioni di confronto
  792                                         usando operatori booleani @samp{||}
  793                                         (``or''), @samp{&&} (``and'') e
  794                                         @samp{!} (``not'').
  795 * Espressioni condizionali::            Le espressioni condizionali scelgono
  796                                         una tra due sottoespressioni, a
  797                                         seconda del valore di una terza
  798                                         sottoespressione.
  799 * Chiamate di funzione::                Una chiamata di funzione @`e
  800                                         un'espressione.
  801 * Precedenza::                          Come si nidificano i vari operatori.
  802 * Localizzazioni::                      Come la localizzazione influenza la
  803                                         gestione dati.
  804 * Sommario delle espressioni::          Sommario delle espressioni.
  805 * Panoramica sui criteri di ricerca::   Come scrivere un criterio di ricerca.
  806 * @dfn{regexp} come criteri di ricerca:: Espressioni regolari come criteri
  807                                         di ricerca.
  808 * Espressioni come criteri di ricerca:: Qualsiasi espressione pu@`o servire da
  809                                         criterio di ricerca.
  810 * Intervalli::                          Specificare intervalli di record con i
  811                                         criteri di ricerca.
  812 * BEGIN/END::                           Specificare regole di inizio e fine
  813                                         programma.
  814 * Usare BEGIN/END::                     Come e perch@'e usare regole BEGIN/END.
  815 * I/O e BEGIN/END::                     Problemi di I/O nelle regole BEGIN/END.
  816 * BEGINFILE/ENDFILE::                   Due condizioni speciali per controlli
  817                                         avanzati.
  818 * Vuoto::                               Il criterio di ricerca vuoto, che
  819                                         corrisponde a ogni record.
  820 * Usare variabili di shell::            Come usare variabili di shell in
  821                                         @command{awk}.
  822 * Panoramica sulle azioni::             Cosa costituisce un'azione.
  823 * Istruzioni::                          Descrizione dettagliata delle varie
  824                                         istruzioni di controllo.
  825 * Istruzione if::                       Eseguire in maniera condizionale
  826                                         istruzioni @command{awk}.
  827 * Istruzione while::                    Eseguire il ciclo, finch@'e @`e
  828                                         verificata una condizione.
  829 * Istruzione do::                       Eseguire l'azione specificata, continuare
  830                                         a eseguire il ciclo
  831                                         finch@'e @`e verificata una condizione.
  832 * Istruzione for::                      Un'altra istruzione iterativa, che
  833                                         permette di specificare clausole
  834                                         iniziali e di incremento.
  835 * Istruzione switch::                   Valutazione di quale insieme di
  836                                         istruzioni eseguire, a seconda del
  837                                         valore assunto da una variabile.
  838 * Istruzione break::                    Uscire subito dal ciclo pi@`u interno
  839                                         in cui ci si trova.
  840 * Istruzione continue::                 Andare alla fine del ciclo pi@`u interno
  841                                         in cui ci si trova.
  842 * Istruzione next::                     Smettere di elaborare il record
  843                                         corrente.
  844 * Istruzione nextfile::                 Smettere di elaborare il file
  845                                         corrente.
  846 * Istruzione exit::                     Interrompere l'esecuzione di @command{awk}.
  847 * Variabili predefinite::               Sommario delle variabili predefinite.
  848 * Variabili modificabili dall'utente::  Variabili predefinite modificabili per
  849                                         controllare @command{awk}.
  850 * Variabili auto-assegnate::            Variabili predefinite con cui
  851                                         @command{awk} fornisce informazioni.
  852 * ARGC e ARGV::                         Modi di usare @code{ARGC} e
  853                                         @code{ARGV}.
  854 * Sommario criteri e azioni::           Sommario criteri e azioni.
  855 * Fondamenti sui vettori::              Informazioni di base sui vettori.
  856 * Introduzione ai vettori::             Introduzione ai vettori.
  857 * Visitare elementi::                   Come esaminare un elemento di un
  858                                         vettore.
  859 * Impostare elementi::                  Come cambiare un elemento di un
  860                                         vettore.
  861 * Esempio di vettore::                  Esempio semplice di vettore
  862 * Visitare un intero vettore::          Variazione dell'istruzione
  863                                         @code{for}. Cicla attraverso gli
  864                                         indici degli elementi contenuti in
  865                                         un vettore.
  866 * Controllare visita::                  Controllare l'ordine in cui i vettori
  867                                         sono visitati.
  868 * Indici numerici di vettore::          Come usare numeri come indici in
  869                                         @command{awk}.
  870 * Indici non inizializzati::            Usare variabili non inizializzate
  871                                         come indici.
  872 * Cancellazione::                       L'istruzione @code{delete} toglie un
  873                                         elemento da un vettore.
  874 * Vettori multidimensionali::           Emulare vettori multidimensionali in
  875                                         @command{awk}.
  876 * Visitare vettori multidimensionali::  Visitare vettori multidimensionali.
  877 * Vettori di vettori::                  Vettori multidimensionali veri.
  878 * Sommario dei vettori::                Sommario dei vettori.
  879 * Funzioni predefinite::                Riepilogo delle funzioni predefinite.
  880 * Chiamare funzioni predefinite::       Come chiamare funzioni predefinite.
  881 * Funzioni numeriche::                  Funzioni che trattano numeri, comprese
  882                                         @code{int()}, @code{sin()}
  883                                         e @code{rand()}.
  884 * Funzioni per stringhe::               Funzioni di manipolazione di stringhe,
  885                                         come @code{split()}, @code{match()}
  886                                         e @code{sprintf()}.
  887 * Dettagli ostici::                     Pi@`u di quel che si vorrebbe sapere su
  888                                         @samp{\} e @samp{&} con @code{sub()},
  889                                         @code{gsub()}, e @code{gensub()}.
  890 * Funzioni di I/O::                     Funzioni per i file e per i comandi
  891                                         della shell.
  892 * Funzioni di tempo::                   Funzione per gestire marcature temporali.
  893 * Funzioni a livello di bit::           Funzioni per operazioni di
  894                                          manipolazione bit.
  895 * Funzioni per i tipi::                 Funzioni per conoscere il tipo
  896                                         di una variabile.
  897 * Funzioni di internazionalizzazione::  Funzioni per tradurre stringhe.
  898 * Funzioni definite dall'utente::       Descrizione dettagliata delle funzioni
  899                                         definite dall'utente.
  900 * Sintassi delle definizioni::          Come scrivere definizioni e cosa
  901                                         significano.
  902 * Esempio di funzione::                 Un esempio di definizione di
  903                                         funzione e spiegazione della stessa.
  904 * Chiamata di una funzione::            Chiamare funzioni definite dall'utente.
  905 * Chiamare una funzione::               Non usare spazi.
  906 * Campo di validit@`a variabili::         Variabili locali e globali.
  907 * Parametri per valore/riferimento::    Passaggio parametri.
  908 * Precisazioni sulle funzioni::         Cose a cui prestare attenzione.
  909 * Istruzione return::                   Specificare il valore che una
  910                                         funzione restituisce.
  911 * Variabili di tipo dinamico::          Come cambiare tipo a una variabile in
  912                                         fase di esecuzione del programma.
  913 * Chiamate indirette::                  Scegliere la funzione da chiamare in
  914                                         fase di esecuzione del programma.
  915 * Sommario delle funzioni::             Sommario delle funzioni.
  916 * Nomi di variabili di libreria::       Che nomi @`e meglio dare alle variabili
  917                                         private globali nelle funzioni di
  918                                         libreria
  919 * Funzioni di tipo generale::           Funzioni di uso generale.
  920 * Funzione strtonum::                   Da usare se non @`e disponibile la
  921                                         funzione predefinita
  922                                         @code{strtonum()}.
  923 * Funzione assert::                     Una funzione per controllare
  924                                         affermazioni in programmi
  925                                         @command{awk}.
  926 * Funzione round::                      Una funzione per eseguire
  927                                         arrotondamenti se @code{sprintf()}
  928                                         non lo fa correttamente.
  929 * Funzione random Cliff::               Il generatore Cliff di numeri casuali.
  930 * Funzioni ordinali::                   Funzioni per usare caratteri come
  931                                         numeri e viceversa.
  932 * Funzione join::                       Una funzione per raccogliere un
  933                                         vettore in una stringa.
  934 * Funzione getlocaltime::               Una funzione per ottenere data e
  935                                         ora nel formato desiderato.
  936 * Funzione readfile::                   Una funzione per leggere un file
  937                                         intero in un colpo solo.
  938 * Apici alla shell::                    Una funzione per passare stringhe
  939                                         con apici alla shell.
  940 * Gestione File Dati::                  Funzioni for gestire file dati
  941                                         specificati sulla riga di comando,
  942 * Funzione filetrans::                  Una funzione per gestire il passaggio
  943                                         da un file in input al successivo.
  944 * Funzione rewind::                     Una funzione per rileggere il file
  945                                         di input.
  946 * Controllo di file::                   Controllare che i file in input siano
  947                                         accessibili.
  948 * File vuoti::                          Controllare se i file in input sono
  949                                         vuoti.
  950 * Ignorare assegnamenti di variabili::  Trattare assegnamenti di variabili
  951                                         come nomi di file.
  952 * Funzione getopt::                     Una funzione per trattare argomenti
  953                                         presenti sulla riga di comando.
  954 * Funzioni Passwd::                     Funzioni per ottenete informazioni
  955                                         sull'utente [da /etc/passwd].
  956 * Funzioni Group::                      Funzioni per ottenete informazioni
  957                                         sul gruppo [da /etc/group].
  958 * Visitare vettori::                    Una funzione per visitare vettori
  959                                         di vettori.
  960 * Sommario funzioni di libreria::       Sommario funzioni di libreria.
  961 * Esercizi con le librerie::            Esercizi.
  962 * Eseguire esempi::                     Come eseguire i programmi di esempio.
  963 * Cloni::                               Cloni di programmi di utilit@`a comuni.
  964 * Programma cut::                       Il programma di utilit@`a @command{cut}.
  965 * Programma egrep::                     Il programma di utilit@`a @command{egrep}.
  966 * Programma id::                        Il programma di utilit@`a @command{id}.
  967 * Programma split::                     Il programma di utilit@`a @command{split}.
  968 * Programma tee::                       Il programma di utilit@`a @command{tee}.
  969 * Programma uniq::                      Il programma di utilit@`a @command{uniq}.
  970 * Programma wc::                        Il programma di utilit@`a @command{wc}.
  971 * Programmi vari::                      Alcuni interessanti programmi in
  972                                         @command{awk}
  973 * Programma dupword::                   Trovare parole duplicate in un
  974                                         documento.
  975 * Programma alarm::                     Un programma di sveglia.
  976 * Programma translate::                 Un programma simile al comando di
  977                                         utilit@`a @command{tr}.
  978 * Programma labels::                    Stampare etichette per lettere.
  979 * Programma utilizzo parole::           Un programma per produrre un contatore
  980                                         dell'utilizzo di parole in un testo.
  981 * Programma riordino diario::           Eliminare righe doppie da un file di
  982                                         cronologia.
  983 * Programma extract::                   Estrarre programmi da file sorgenti
  984                                         Texinfo.
  985 * Programma sed semplice::              Un semplice editor di flusso.
  986 * Programma igawk::                     Un programma per fornire ad
  987                                         @command{awk} la possibilit@`a di
  988                                         includere file.
  989 * Programma anagram::                   Trovare anagrammi da una lista di
  990                                         parole.
  991 * Programma signature::                 La gente fa cose stupefacenti se ha
  992                                         troppo tempo libero.
  993 * Sommario dei programmi::              Sommario dei programmi.
  994 * Esercizi sui programmi::              Esercizi.
  995 * Dati non decimali::                   Consentire dati di input in base
  996                                         diversa da 10.
  997 * Ordinamento di vettori::              Modi per controllare la visita di un
  998                                         vettore e il suo ordinamento.
  999 * Controllare visita vettori::          Come usare PROCINFO["sorted_in"].
 1000 * Funzioni di ordinamento di vettori::  Come usare @code{asort()} e
 1001                                         @code{asorti()}.
 1002 * I/O bidirezionale::                   Comunicazione nei due sensi con un
 1003                                         altro processo.
 1004 * Reti TCP/IP::                         Usare @command{gawk} per
 1005                                         programmazione di rete.
 1006 * Profilare::                           Profilare i propri programmi
 1007                                         @command{awk}.
 1008 * Sommario funzionalit@`a avanzate::    Sommario funzionalit@`a avanzate.
 1009 * I18N e L10N::                         Internazionalizzazione e localiz.
 1010 * Utilizzare @command{gettext}::        Come funziona GNU @code{gettext}.
 1011 * I18N per programmatore::              Funzionalit@`a per il programmatore.
 1012 * I18N per traduttore::                 Funzionalit@`a per il traduttore.
 1013 * Estrazione di stringhe::              Estrarre stringhe marcate.
 1014 * Ordinamento di printf::               Riordinare argomenti @code{printf}
 1015                                         [nelle stringhe da tradurre].
 1016 * Portabilit@`a nell'I18N::              Problemi di portabilit@`a a livello di
 1017                                         @command{awk}.
 1018 * Esempio I18N::                        Un semplice esempio di
 1019                                         internazionalizzazione.
 1020 * Gawk internazionalizzato::            @command{gawk} stesso @`e
 1021                                         internazionalizzato.
 1022 * Sommario I18N::                       Sommario sull'internazionalizzazione.
 1023 * Debugging::                           Introduzione al debugger di
 1024                                         @command{gawk}.
 1025 * Nozioni sul debug::                   Generalit@`a sul debug.
 1026 * Terminologia nel debug::              Concetti fondamentali sul debug.
 1027 * Debug di Awk::                        Il debug di @command{awk}.
 1028 * Esempio di sessione di debug::        Esempio di sessione di debug di
 1029                                         @command{gawk}.
 1030 * Invocazione del debugger::            Come avviare il debugger.
 1031 * Trovare il bug::                      Trovare il bug.
 1032 * Lista dei comandi di debug::          I principali comandi di debug.
 1033 * Controllo dei breakpoint::            Controllo dei punti d'interruzione.
 1034 * Controllo esecuzione debugger::       Controllo di esecuzione.
 1035 * Vedere e modificare dati::            Vedere e modificare dati.
 1036 * Stack di esecuzione::                 Lavorare con lo stack.
 1037 * Informazioni sul debugger::           Ottenere informazioni sullo stato
 1038                                         del programma e del debugger.
 1039 * Comandi vari del debugger::           Comandi vari del debugger.
 1040 * Supporto per Readline::               Supporto per Readline.
 1041 * Limitazioni::                         Limitazioni.
 1042 * Sommario sul debug::                  Sommario sul debug.
 1043 * Spazio-dei-nomi globale::             Lo spazio-dei-nomi globale in
 1044                                         @command{awk} standard.
 1045 * Nomi qualificati::                    Come qualificare nomi con uno
 1046                                         spazio-dei-nomi.
 1047 * Spazio-dei-nomi di default::          Lo spazio-dei-nomi di default.
 1048 * Cambiare lo spazio-dei-nomi::         Come cambiare lo spazio-dei-nomi.
 1049 * Regole per i nomi::                   Regole per assegnare nomi a uno
 1050                                         spazio-dei-nomi e ai suoi componenti.
 1051 * Gestione interna dei nomi::           Come i nomi sono gestiti internamente.
 1052 * Esempio di spazio-dei-nomi::  Esempio di codice che usa uno spazio-dei-nomi.
 1053 * Spazio-dei-nomi e funzionalit@`a::      Lo spazio-dei-nomi e le altre
 1054                                         funzionalit@`a di @command{gawk}.
 1055 * Sommario sugli spazi-dei-nomi::       Sommario sugli spazi-dei-nomi.
 1056 * Aritmetica del computer::             Una rapida introduzione alla matematica del
 1057                                         computer.
 1058 * Definizioni matematiche::             Altre cose da sapere.
 1059 * Funzionalit@`a MPFR::                   Funzionalit@`a per il calcolo a
 1060                                         precisione arbitraria in @command{gawk}
 1061 * Cautela col calcolo in VM::           Cose da sapere.
 1062 * Inesattezza nei calcoli::             La matematica in virgola mobile non @`e
 1063                                         esatta.
 1064 * Rappresentazioni inesatte::           Molti numeri non sono rappresentati
 1065                                         esattamente.
 1066 * Confronti tra valori in VM::          Come confrontare valori in virgola mobile.
 1067 * Gli errori si sommano::               Gli errori diventano sempre maggiori.
 1068 * Ottenere la precisione::              Ottenere la precisione voluta.
 1069 * Tentare di arrotondare::              Tentare di aggiungere bit di precisione e
 1070                                         arrotondare.
 1071 * Impostare la precisione::             Impostare la precisione.
 1072 * Impostare modo di arrotondare::       Impostare la modalit@`a di
 1073                                         arrotondamento.
 1074 * Controllare disponibilit@`a MPFR::      Come controllare se MPFR @`e disponibile.
 1075 * Interi a precisione arbitraria::      Aritmetica dei numeri interi a precisione
 1076                                         arbitraria con @command{gawk}.
 1077 * Problemi virgola mobile POSIX::       Confronto tra standard e uso corrente.
 1078 * Sommario virgola mobile::             Sommario della trattazione della
 1079                                         virgola mobile.
 1080 * Introduzione alle estensioni::        Cos'@`e un'estensione.
 1081 * Licenza delle estensioni::            tipo di licenza delle estensioni.
 1082 * Panoramica sul meccanismo delle estensioni:: Come funziona a grandi linee.
 1083 * Descrizione dell'estensione API:: Una descrizione completa dell'API.
 1084 * Intro funzioni estensione API:: Introduzione alle funzioni dell'API.
 1085 * Tipi di dati generali::               I tipi di dati.
 1086 * Funzioni di allocazione memoria::     Funzioni per allocare memoria.
 1087 * Funzioni di costruzione::             Funzioni per creare valori.
 1088 * Funzioni di registrazione::           Funzioni per registrare cose con
 1089                                         @command{gawk}.
 1090 * Funzioni di estensione::              Registrare funzioni di estensione.
 1091 * Funzioni di exit callback::           Registrare una exit di callback.
 1092 * Stringa di versione Estensioni::      Registrare una stringa di versione.
 1093 * Analizzatori di input::               Registrare un analizzatore di input.
 1094 * Processori di output::                Registrare un processore di output.
 1095 * Processori bidirezionali::            Registrare un processore
 1096                                         bidirezionale.
 1097 * Stampare messaggi::                   Stampare messaggi dalle estensioni.
 1098 * Aggiornare @code{ERRNO}::             Funzioni per aggiornare @code{ERRNO}.
 1099 * Richiedere valori::                   Come ottenere un valore.
 1100 * Accedere ai parametri::               Funzioni per acceder ai parametri.
 1101 * Accedere alla tabella simboli::       Funzioni per accedere alle variabili
 1102                                         globali.
 1103 * Tabella simboli per nome::            Accedere e aggiornare variabili per nome.
 1104 * Tabella simboli tramite cookie::      Accedere alle variabili per ``cookie''.
 1105 * Valori nascosti::                     Creare e usare valori nascosti.
 1106 * Manipolazione di vettori::            Funzioni per lavorare coi vettori.
 1107 * Tipi di dati per i vettori::          Tipi dati per lavorare coi vettori.
 1108 * Funzioni per i vettori::              Funzioni per lavorare coi vettori.
 1109 * Appiattimento di vettori::            Come appiattire i vettori.
 1110 * Creazione di vettori::                Come creare e popolare vettori.
 1111 * Ridirezione API::                     Come accedere alla ridirezioni e
 1112                                         modificarle.
 1113 * Variabili dell'estensione API::       Variabili fornite dall'API.
 1114 * Versione dell'estensione::            Informazioni sulla versione API.
 1115 * Versione estensione GMP/MPFR::        Informazioni sulla versione disponibile
 1116                                         di GMP ed MPFR.
 1117 * Variabili informative di estens. API:: Variabili che forniscono informazioni
 1118                                         sull'invocazione di @command{gawk}.
 1119 * Codice predefinito di un'estensione API:: Codice predefinito di interfaccia API.
 1120 * Modifiche dalla versione API 1::      Modifiche dalla versione 1 dell'API.
 1121 * Trovare le estensioni::               Come @command{gawk} trova le
 1122                                         estensioni compilate.
 1123 * Esempio di estensione::               Esempio di codice C di un'estensione.
 1124 * Descrizione interna file::            Quello che le nuove funzioni faranno.
 1125 * Operazioni interne file::             Codice per gestire file all'interno.
 1126 * Usare operazioni interne file::       Come usare un'estensione esterna.
 1127 * Esempi di estensione::                Le estensioni di esempio incluse con
 1128                                         @command{gawk}.
 1129 * Esempio di estensione funzioni file:: Funzioni relative ai file.
 1130 * Esempio di estensione Fnmatch::       Un'interfaccia a @code{fnmatch()}.
 1131 * Esempio di estensione Fork::          Un'interfaccia a @code{fork()} e
 1132                                         altre funzioni di processo.
 1133 * Esempio di estensione Inplace::       Consentire modifica file input
 1134                                         nell'estensione.
 1135 * Esempio di estensione Ord::           Conversioni di caratteri in valori
 1136                                         numerici e viceversa.
 1137 * Esempio di estensione Readdir::       Un'interfaccia a @code{readdir()}.
 1138 * Esempio di estensione Revout::        Invertire la stringa in output.
 1139 * Esempio di estensione Rev2way::       Esempio di I/O bidirezionale.
 1140 * Esempio di estensione Rwarray::       Scaricare e ricaricare un vettore.
 1141 * Esempio di estensione Readfile::      Leggere un intero file in una stringa.
 1142 * Esempio di estensione Time::          Un'interfaccia a @code{gettimeofday()}
 1143                                         e @code{sleep()}.
 1144 * Esempio di estensione API Test::      Test per l'API.
 1145 * gawkextlib::                          Il progetto @code{gawkextlib}.
 1146 * Sommario delle estensioni::           Sommario delle estensioni.
 1147 * Esercizi sulle estensioni::           Esercizi.
 1148 * V7/SVR3.1::                           Le principali differenze tra V7 e
 1149                                         System V Release 3.1.
 1150 * SVR4::                                Differenze minori tra System V
 1151                                         Release 3.1 e 4.
 1152 * POSIX::                               Nuove funzionalit@`a per lo standard
 1153                                         POSIX.
 1154 * BTL::                                 Nuove funzionalit@`a dalla versione
 1155                                         di @command{awk} di Brian Kernighan.
 1156 * POSIX/GNU::                           Le estensioni in @command{gawk} non
 1157                                         previste in @command{awk} POSIX.
 1158 * Storia delle funzionalit@`a::           Storia delle funzionalit@`a di
 1159                                         @command{gawk}.
 1160 * Estensioni comuni::                   Sommario Estensioni comuni.
 1161 * Intervalli e localizzazione::         Come le localizzazioni influiscono
 1162                                         sugli intervalli delle espressioni
 1163                                         regolari.
 1164 * Contributori::                        I maggiori contributori a
 1165                                         @command{gawk}.
 1166 * Sommario della storia::               Sommario della storia.
 1167 * Distribuzione di Gawk::               Contenuto della distribuzione di
 1168                                         @command{gawk}.
 1169 * Scaricare::                           Come ottenere la distribuzione.
 1170 * Scompattazione::                      Come estrarre la distribuzione.
 1171 * Contenuti della distribuzione::       Cosa c'@`e nella distribuzione.
 1172 * Installazione Unix::                  Installare @command{gawk} su
 1173                                         varie versioni di Unix.
 1174 * Installazione veloce::                Compilare @command{gawk} sotto Unix.
 1175 * File da usare a inizio sessione::     Funzioni di personalizzazione shell.
 1176 * Ulteriori opzioni di configurazione:: Altre opzioni utilizzabili in fase
 1177                                         di compilazione.
 1178 * Filosofia della configurazione::      Come si suppone che funzioni.
 1179 * Installazione non-Unix::              Installazioni su altri Sistemi
 1180                                         Operativi.
 1181 * Installazione su PC::                 Installare e compilare
 1182                                         @command{gawk} su Microsoft Windows.
 1183 * Installazione binaria su PC::         Installare una distribuzione pronta
 1184                                         all'uso.
 1185 * Compilazione su PC::                  Compilare @command{gawk} per
 1186                                         Windows32.
 1187 * Uso su PC::                           Eseguire @command{gawk} su Windows32.
 1188 * Cygwin::                              Compilare ed eseguire @command{gawk}
 1189                                         per Cygwin.
 1190 * MSYS::                                Usare @command{gawk} nell'ambiente
 1191                                         MSYS.
 1192 * Installazione su VMS::                Installare @command{gawk} su VMS.
 1193 * Compilazione su VMS::                 Come compilare @command{gawk} su
 1194                                         VMS.
 1195 * Estensioni dinamiche su VMS::         Compilare estensioni dinamiche
 1196                                         di @command{gawk} su VMS.
 1197 * Dettagli installazione su VMS::       Come installare @command{gawk} su
 1198                                         VMS.
 1199 * Esecuzione su VMS::                   Come eseguire @command{gawk} su VMS.
 1200 * GNV su VMS::                          Il progetto GNV di VMS.
 1201 * Vecchio Gawk su VMS::                 Una versione non aggiornata arriva
 1202                                         con alcune versioni di VMS.
 1203 * Bug::                                 Notificare problemi e bug.
 1204 * Indirizzo Bug::                       Dove notificare problemi.
 1205 * Usenet::                              Dove non notificare problemi.
 1206 * Manutentori::                         Manutentori di version non-*nix.
 1207 * Altre versioni::                      Altre implementazioni di
 1208                                         @command{awk} liberamente
 1209                                         disponibili.
 1210 * Sommario dell'installazione::         Sommario dell'installazione.
 1211 * Modalit@`a di compatibilit@`a::           Come inibire alcune estensioni di
 1212                                         @command{gawk}.
 1213 * Aggiunte::                            Fare aggiunte a @command{gawk}.
 1214 * Accedere ai sorgenti::                Accedere al deposito sorgenti Git.
 1215 * Aggiungere codice::                   Aggiungere codice al programma
 1216                                         principale @command{gawk}.
 1217 * Nuovi sistemi::                       Rendere disponibile @command{gawk}
 1218                                         a un nuovo sistema operativo.
 1219 * File derivati::                       Perch@'e i file ancillari sono tenuti
 1220                                         nel deposito @command{git}.
 1221 * Future estensioni::                   Nuove funzionalit@`a che potranno
 1222                                         essere implementate in futuro.
 1223 * Limitazioni dell'implementazione::    Alcune limitazioni
 1224                                         dell'implementazione.
 1225 * Progetto delle estensioni::           Note di progetto sull'estensione API.
 1226 * Problemi con le vecchie estensioni::  Problemi con la precedente
 1227                                         implementazione di estensioni.
 1228 * Obiettivi delle estensioni::          Obiettivi del nuovo meccanismo.
 1229 * Altre scelte progettuali per le estensioni:: Qualche altra scelta progettuale.
 1230 * Futuri sviluppi delle estensioni::    Possibilit@`a di crescita futura.
 1231 * Sommario delle note::                 Sommario delle note di
 1232                                         implementazione.
 1233 * Fondamenti ad alto livello::          Una visione dall'alto.
 1234 * Fondamenti sui tipi di dati::         Una velocissima introduzione ai tipi
 1235                                         di dati.
 1236 @end detailmenu
 1237 @end menu
 1238 
 1239 @c dedication for Info file
 1240 @ifinfo
 1241 Ai miei genitori, per il loro amore, e per lo splendido
 1242 esempio che mi hanno dato.
 1243 @sp 1
 1244 A mia moglie Miriam, per avermi reso completo.
 1245 Grazie per aver costruito la tua vita insieme a me.
 1246 @sp 1
 1247 Ai nostri figli Chana, Rivka, Nachum e Malka,
 1248 per aver arricchito le nostre vite in misura incalcolabile.
 1249 @end ifinfo
 1250 
 1251 @ifset SMALLPRINT
 1252 @fonttextsize 10
 1253 @end ifset
 1254 
 1255 @summarycontents
 1256 @contents
 1257 
 1258 @ifset SMALLPRINT
 1259 @fonttextsize 11
 1260 @end ifset
 1261 
 1262 @node Introduzione3
 1263 @unnumbered Introduzione alla Terza Edizione
 1264 
 1265 @c This bit is post-processed by a script which turns the chapter
 1266 @c tag into a preface tag, and moves this stuff to before the title.
 1267 @c Bleah.
 1268 @docbook
 1269   <prefaceinfo>
 1270     <author>
 1271       <firstname>Michael</firstname>
 1272       <surname>Brennan</surname>
 1273       <!-- can't put mawk into command tags. sigh. -->
 1274       <affiliation><jobtitle>Autore di mawk</jobtitle></affiliation>
 1275     </author>
 1276     <date>Marzo 2001</date>
 1277    </prefaceinfo>
 1278 @end docbook
 1279 
 1280 Arnold Robbins e io siamo buoni amici. Ci siamo conosciuti
 1281 @c 11 years ago
 1282 nel 1990 per un insieme di
 1283 circostanze --- e per il nostro linguaggio di programmazione preferito, AWK.
 1284 Tutto era iniziato un paio d'anni prima.
 1285 Avevo appena iniziato un nuovo lavoro e avevo notato un computer Unix scollegato
 1286 che giaceva in un angolo.
 1287 Nessuno sapeva come usarlo, tanto meno io.  Comunque,
 1288 qualche giorno pi@`u tardi, stava funzionando, con
 1289 me come @code{root} e solo e unico utente.
 1290 Quel giorno, iniziai la transizione da statistico a programmatore Unix.
 1291 
 1292 In uno dei miei giri per biblioteche e librerie alla ricerca di libri sullo
 1293 Unix, trovai il libro, dalla copertina grigia, su AWK, noto anche come @:
 1294 Alfred V.@: Aho, Brian W.@: Kernighan e
 1295 Peter J.@: Weinberger, @cite{The AWK Programming Language}, (Addison-Wesley,
 1296 1988).  Il semplice paradigma di programmazione di AWK --- trovare
 1297 un'espressione di ricerca nell'input e di conseguenza compiere
 1298 un'azione --- riduceva spesso
 1299 complesse e tediose manipolazioni di dati a poche righe di codice.  Ero
 1300 entusiasta di cimentarmi nella programmazione in AWK.
 1301 
 1302 Ahim@`e, l'@command{awk} sul mio computer era una versione limitata del
 1303 linguaggio descritto nel libro grigio.  Scoprii che il mio computer aveva il
 1304 ``vecchio @command{awk}'' mentre il libro descriveva il ``nuovo
 1305 @command{awk}.''
 1306 Imparai che non era un caso isolato; la vecchia versione si rifiutava di farsi da
 1307 parte o di cedere il suo nome.  Se un sistema aveva un nuovo @command{awk},
 1308 questo era chiamato invariabilmente @command{nawk}, e pochi sistemi lo avevano.
 1309 Il miglior modo per ottenere un nuovo @command{awk} era quello di scaricare via
 1310 @command{ftp} il codice sorgente di @command{gawk} da @code{prep.ai.mit.edu}.
 1311 @command{gawk} era una versione del nuovo @command{awk} scritta da David Trueman
 1312 e Arnold, e disponibile sotto la GNU General Public License.
 1313 
 1314 Per inciso, ora non @`e
 1315 pi@`u cos@`{@dotless{i}} difficile trovare un nuovo @command{awk}.  @command{gawk} viene
 1316 fornito con GNU/Linux, e si possono scaricare i binari e il codice sorgente per
 1317 quasi tutti i sistemi; mia moglie usa @command{gawk} nella sua stazione di lavoro VMS.
 1318 
 1319 Il mio sistema Unix non era inizialmente collegato a una presa di corrente; a
 1320 maggior ragione non era collegato a una rete.  Cos@`{@dotless{i}}, ignaro dell'esistenza di
 1321 @command{gawk} e in generale della comunit@`a di Unix, e desiderando un nuovo
 1322 @command{awk}, ne scrissi uno mio, chiamato @command{mawk}.  Prima di aver
 1323 finito, scoprii l'esistenza di @command{gawk},
 1324 ma era troppo tardi per fermarmi, cos@`{@dotless{i}} alla fine inviai un messaggio
 1325 a un newsgroup @code{comp.sources}.
 1326 
 1327 Qualche giorno dopo ricevetti un cordiale messaggio di posta elettronica
 1328 da Arnold che si presentava.
 1329 Propose di scambiarci progetti e algoritmi, e
 1330 alleg@`o una bozza dello standard POSIX, che mi permise di
 1331 aggiornare @command{mawk} per includere le estensioni al linguaggio
 1332 aggiunte dopo la pubblicazione di @cite{The AWK Programming Language}.
 1333 
 1334 Francamente, se i nostri ruoli fossero stati
 1335 invertiti, io non sarei stato cos@`{@dotless{i}} disponibile e probabilmente non ci
 1336 saremmo mai incontrati.  Sono felice che l'incontro sia avvenuto.
 1337 Lui @`e un vero esperto tra gli esperti di AWK e una persona squisita.
 1338 Arnold mette a disposizione della Free Software Foundation parti significative
 1339 della sua esperienza e del suo tempo.
 1340 
 1341 Questo libro @`e il manuale di riferimento di @command{gawk}, ma sostanzialmente
 1342 @`e un libro sulla programmazione in AWK che
 1343 interesser@`a un vasto pubblico.
 1344 @`E un riferimento completo al linguaggio AWK come definito dalla versione del
 1345 1987 di Bell Laboratories e codificato nelle POSIX Utilities
 1346 standard del 1992.
 1347 
 1348 D'altra parte, un programmatore AWK alle prime armi pu@`o studiare
 1349 una quantit@`a di programmi pratici che permettono di apprezzare
 1350 la potenza dei concetti di base di AWK:
 1351 flusso di controllo guidato dai dati, ricerca di corrispondenze tramite
 1352 espressioni regolari e vettori associativi.
 1353 Chi desidera qualcosa di nuovo pu@`o provare l'interfaccia di @command{gawk}
 1354 verso i protocolli di rete attraverso i file speciali @file{/inet}.
 1355 
 1356 I programmi in questo libro evidenziano come un programma AWK sia
 1357 generalmente molto pi@`u piccolo e veloce da sviluppare
 1358 di uno equivalente scritto in C.
 1359 Di conseguenza, @`e spesso conveniente creare un prototipo di un
 1360 algoritmo o di un progetto in AWK per arrivare a eseguirlo in breve tempo e
 1361 scoprire prima i problemi che possono presentarsi. Spesso, l'efficienza di
 1362 questa versione iniziale interpretata @`e sufficiente e il prototipo
 1363 AWK diventa il prodotto finale.
 1364 
 1365 Il nuovo comando @command{pgawk} (profiling @command{gawk}) produce
 1366 conteggi sull'esecuzione delle istruzioni del programma.
 1367 Recentemente ho fatto un tentativo con un algoritmo che, a fronte di
 1368 @ifnotdocbook
 1369 @math{n}
 1370 @end ifnotdocbook
 1371 @ifdocbook
 1372 @i{n}
 1373 @end ifdocbook
 1374 righe di input, produceva il risultato in un tempo
 1375 @tex
 1376 $\sim\! Cn^2$,
 1377 @end tex
 1378 @ifnottex
 1379 @ifnotdocbook
 1380 ~ C n^2,
 1381 @end ifnotdocbook
 1382 @end ifnottex
 1383 @docbook
 1384 <emphasis>&sim; Cn<superscript>2</superscript></emphasis>
 1385 @end docbook
 1386 mentre in teoria
 1387 avrebbe dovuto terminare in un tempo
 1388 @tex
 1389 $\sim\! Cn\log n$.
 1390 @end tex
 1391 @ifnottex
 1392 @ifnotdocbook
 1393 ~ C n log n.
 1394 @end ifnotdocbook
 1395 @end ifnottex
 1396 @docbook
 1397 <emphasis>&sim; Cn log n</emphasis>
 1398 @end docbook
 1399 Dopo qualche minuto di attenta lettura
 1400 del profilo in @file{awkprof.out}, ho ricondotto il problema a
 1401 una singola riga di codice.  @command{pgawk} @`e una gradita integrazione
 1402 ai miei strumenti di programmatore.
 1403 
 1404 Arnold ha condensato in questo libro oltre un decennio di esperienza nell'uso di
 1405 programmi AWK e nello sviluppo di @command{gawk}.  Se si vuole usare
 1406 AWK o imparare ad usarlo, @`e consigliabile leggere questo libro.
 1407 
 1408 @ifnotdocbook
 1409 @cindex Brennan, Michael
 1410 @display
 1411 Michael Brennan
 1412 Autore di @command{mawk}
 1413 Marzo 2001
 1414 @end display
 1415 @end ifnotdocbook
 1416 
 1417 @node Introduzione4
 1418 @unnumbered Introduzione alla Quarta Edizione
 1419 
 1420 @c This bit is post-processed by a script which turns the chapter
 1421 @c tag into a preface tag, and moves this stuff to before the title.
 1422 @c Bleah.
 1423 @docbook
 1424   <prefaceinfo>
 1425     <author>
 1426       <firstname>Michael</firstname>
 1427       <surname>Brennan</surname>
 1428       <!-- can't put mawk into command tags. sigh. -->
 1429       <affiliation><jobtitle>Autore di mawk</jobtitle></affiliation>
 1430     </author>
 1431     <date>Ottobre 2014</date>
 1432    </prefaceinfo>
 1433 @end docbook
 1434 
 1435 Ci sono cose che non cambiano.  Tredici anni fa scrivevo:
 1436 ``Se si vuole usare AWK o imparare ad usarlo, @`e consigliabile
 1437 leggere questo libro.''
 1438 Era vero allora e rimane vero anche oggi.
 1439 
 1440 Imparare a usare un linguaggio di programmazione richiede qualcosa di pi@`u
 1441 che padroneggiarne la sintassi.  Occorre comprendere come
 1442 usare le funzionalit@`a del linguaggio per risolvere problemi pratici di
 1443 programmazione.  Uno dei punti pi@`u importanti di questo libro @`e che
 1444 fornisce molti esempi che mostrano come utilizzare AWK.
 1445 
 1446 Altre cose, invece, cambiano. I nostri computer sono diventati molto pi@`u
 1447 veloci e la loro memoria @`e molto pi@`u estesa.
 1448 Per questa ragione, la velocit@`a di esecuzione e l'uso efficiente della
 1449 memoria, caratteristiche di un linguaggio di livello elevato, hanno minore
 1450 rilevanza.
 1451 Scrivere un programma prototipo in AWK per poi riscriverlo in C per
 1452 migliorare l'utilizzo delle risorse capita sempre meno, perch@'e sempre pi@`u
 1453 spesso il prototipo @`e abbastanza veloce anche per essere messo in produzione.
 1454 
 1455 Naturalmente, ci sono tipi di calcoli che sono effettuati pi@`u agevolmente
 1456 da programmi scritti in C o C++.
 1457 Con @command{gawk} 4.1 e successive versioni, non @`e necessario
 1458 decidere se scrivere un programma in AWK oppure in C/C++.  Si pu@`o scrivere
 1459 buona parte del programma in AWK e le parti che richiedono
 1460 specificamente il C/C++ possono essere scritte in C/C++ e quindi il tutto
 1461 pu@`o essere eseguito come un programma unico, con il modulo @command{gawk}
 1462 che carica dinamicamente il modulo C/C++ in fase di esecuzione.
 1463 @c Chapter 16
 1464 @iftex
 1465 Il
 1466 @end iftex
 1467 @ref{Estensioni dinamiche},
 1468 spiega la procedura in gran
 1469 dettaglio, e, come prevedibile, riporta molti esempi che sono di aiuto per
 1470 approfondire anche gli aspetti pi@`u complessi.
 1471 
 1472 @`E per me un piacere programmare in AWK ed @`e stato divertente (ri)leggere
 1473 questo libro.  Penso che sar@`a lo stesso per voi.
 1474 
 1475 @ifnotdocbook
 1476 @cindex Brennan, Michael
 1477 @display
 1478 Michael Brennan
 1479 Autore di @command{mawk}
 1480 Ottobre 2014
 1481 @end display
 1482 @end ifnotdocbook
 1483 @node Prefazione
 1484 @unnumbered Prefazione
 1485 @c I saw a comment somewhere that the preface should describe the book itself,
 1486 @c and the introduction should describe what the book covers.
 1487 @c
 1488 @c 12/2000: Chuck wants the preface & intro combined.
 1489 
 1490 @c This bit is post-processed by a script which turns the chapter
 1491 @c tag into a preface tag, and moves this stuff to before the title.
 1492 @c Bleah.
 1493 @docbook
 1494   <prefaceinfo>
 1495     <author>
 1496       <firstname>Arnold</firstname>
 1497       <surname>Robbins</surname>
 1498       <affiliation><jobtitle>Nof Ayalon</jobtitle></affiliation>
 1499       <affiliation><jobtitle>Israel</jobtitle></affiliation>
 1500     </author>
 1501     <date>Febbraio 2015</date>
 1502    </prefaceinfo>
 1503 @end docbook
 1504 
 1505 @cindex @command{awk}
 1506 Lavorando con file di testo capita di dover eseguire alcuni tipi ripetitivi di
 1507 operazioni. Si potrebbe voler estrarre alcune righe e scartare il resto, o fare
 1508 modifiche laddove siano verificate certe condizioni, lasciando inalterato il
 1509 resto del file.  Questi compiti risultano spesso pi@`u agevoli usando
 1510 @command{awk}.  Il programma di utilit@`a @command{awk} interpreta un linguaggio
 1511 di programmazione specializzato che rende facile eseguire semplici attivit@`a
 1512 di riformattazione di dati.
 1513 
 1514 @cindex @command{gawk}
 1515 L'implementazione GNU di @command{awk} @`e chiamata @command{gawk}; se
 1516 invocato con le opzioni o con le variabili d'ambiente appropriate,
 1517 (@pxref{Opzioni}), @`e pienamente
 1518 compatibile con le specifiche
 1519 POSIX@footnote{Lo standard POSIX 2018 @`e accessibile in rete all'indirizzo
 1520 @url{https://pubs.opengroup.org/onlinepubs/9699919799/}.}
 1521 del linguaggio @command{awk}
 1522 e con la versione Unix di @command{awk} mantenuta
 1523 da Brian Kernighan.
 1524 Ci@`o implica che tutti i programmi
 1525 @command{awk} scritti correttamente dovrebbero funzionare con @command{gawk}.
 1526 Perci@`o nella maggior parte dei casi non si distingue tra @command{gawk} e
 1527 altre implementazioni di @command{awk}.
 1528 
 1529 @cindex @command{awk} @subentry POSIX e @seealso{POSIX @command{awk}}
 1530 @cindex @command{awk} @subentry POSIX e
 1531 @cindex POSIX @subentry @command{awk} e
 1532 @cindex @command{gawk} @subentry @command{awk} e
 1533 @cindex @command{awk} @subentry @command{gawk} e
 1534 @cindex @command{awk} @subentry uso di
 1535 Usando @command{awk} si possono:
 1536 
 1537 @itemize @value{BULLET}
 1538 @item
 1539 Gestire piccole basi di dati personali
 1540 
 1541 @item
 1542 Generare rapporti
 1543 
 1544 @item
 1545 Validare dati
 1546 
 1547 @item
 1548 Produrre indici ed effettuare altre operazioni per la preparazione di documenti
 1549 
 1550 @item
 1551 Sperimentare algoritmi che possono essere adattati in seguito ad altri
 1552 linguaggi per computer
 1553 @end itemize
 1554 
 1555 @cindex @command{awk} @seealso{@command{gawk}}
 1556 @cindex @command{gawk} @seealso{@command{awk}}
 1557 @cindex @command{gawk} @subentry uso di
 1558 Inoltre,
 1559 @command{gawk}
 1560 fornisce strumenti che rendono facile:
 1561 
 1562 @itemize @value{BULLET}
 1563 @item
 1564 Estrarre frammenti di dati per l'elaborazione
 1565 
 1566 @item
 1567 Ordinare dati
 1568 
 1569 @item
 1570 Effettuare semplici comunicazioni di rete
 1571 
 1572 @item
 1573 Creare il profilo di esecuzione ed effettuare il debug
 1574 di programmi @command{awk}.
 1575 
 1576 @item
 1577 Estendere il linguaggio con funzioni scritte in C o C++.
 1578 @end itemize
 1579 
 1580 Questo @value{DOCUMENT} spiega il linguaggio @command{awk} e come lo si pu@`o
 1581 usare efficacemente.  @`E richiesta una familiarit@`a coi comandi di sistema
 1582 di base, come @command{cat} e @command{ls},@footnote{Questi programmi di
 1583 utilit@`a sono disponibili sui sistemi conformi a POSIX, come pure sui sistemi
 1584 tradizionali basati su Unix. Se si usa qualche altro sistema operativo, si
 1585 deve comunque avere familiarit@`a con i concetti di ridirezione I/O e di
 1586 @dfn{pipe}.} cos@`{@dotless{i}} come con le funzionalit@`a di base della shell, come la
 1587 ridirezione, l'input/output (I/O) e le @dfn{pipe}.
 1588 
 1589 @cindex GNU @command{awk} @seeentry{@command{gawk}}
 1590 Implementazioni del linguaggio @command{awk} sono disponibili per diversi
 1591 sistemi operativi di computer.  Questo @value{DOCUMENT}, oltre a descrivere il
 1592 linguaggio @command{awk} in generale, descrive anche la specifica
 1593 implementazione di @command{awk} chiamata @command{gawk} (che sta per
 1594 ``GNU @command{awk}'').  @command{gawk} funziona su una vasta gamma di sistemi
 1595 Unix, dai PC basati su architettura Intel fino
 1596 a sistemi di potenza molto maggiore.
 1597 @command{gawk} @`e stato portato anche su Mac OS X,
 1598 Microsoft Windows
 1599 (tutte le versioni),
 1600 e OpenVMS.@footnote{Qualche altro sistema operativo obsoleto su cui
 1601 @command{gawk} era stato portato non @`e pi@`u mantenuto e il codice specifico
 1602 per quei sistemi @`e stato rimosso.}
 1603 
 1604 @menu
 1605 * Storia::                              La storia di @command{gawk} e
 1606                                         @command{awk}.
 1607 * Nomi::                                Che nome usare per trovare
 1608                                         @command{awk}.
 1609 * Questo manuale::                      Uso di questo @value{DOCUMENT}.
 1610                                         Comprende esempi di file in input
 1611                                         utilizzabili.
 1612 * Convenzioni::                         Convenzioni tipografiche.
 1613 * Storia del manuale::                  Breve storia del Progetto GNU e di
 1614                                         questo @value{DOCUMENT}.
 1615 @ifset FOR_PRINT
 1616 * Aggiornamenti::                       Come tenersi al corrente.
 1617 @end ifset
 1618 * Come contribuire::                    Un aiuto per la salvezza del mondo.
 1619 * Ringraziamenti::                      Ringraziamenti.
 1620 @end menu
 1621 
 1622 @node Storia
 1623 @unnumberedsec La storia di @command{gawk} e @command{awk}
 1624 @cindex ricetta per un linguaggio di programmazione
 1625 @cindex linguaggi di programmazione @subentry ricetta per
 1626 @cindex programmazione @subentry ricetta per linguaggi di
 1627 @sidebar Ricetta per un linguaggio di programmazione
 1628 
 1629 @multitable {2 parti di} {1 parte di  @code{egrep}} {1 parte di  @code{snobol}}
 1630 @item @tab 1 parte di  @code{egrep} @tab 1 parte di  @code{snobol}
 1631 @item @tab 2 parti di @code{ed} @tab 3 parti di C
 1632 @end multitable
 1633 
 1634 Mescolare bene tutte le parti usando @code{lex} e @code{yacc}.
 1635 Preparare una concisa documentazione e distribuire.
 1636 
 1637 Dopo otto anni, aggiungere un'altra parte di @code{egrep} e altre due
 1638 parti di C.  Documentare molto bene e distribuire.
 1639 @end sidebar
 1640 
 1641 @cindex Aho, Alfred
 1642 @cindex Weinberger, Peter
 1643 @cindex Kernighan, Brian
 1644 @cindex @command{awk} @subentry storia di
 1645 Il nome @command{awk} deriva dalle iniziali dei suoi progettisti: Alfred V.@:
 1646 Aho, Peter J.@: Weinberger e Brian W.@: Kernighan.  La versione originale di
 1647 @command{awk} fu scritta nel 1977 negli AT&T Bell Laboratories.
 1648 Nel 1985, una nuova versione rese il linguaggio di programmazione
 1649 pi@`u potente, introducendo le funzioni definite dall'utente, flussi di input
 1650 multipli ed espressioni regolari calcolate.
 1651 Questa nuova versione ebbe larga diffusione con Unix System V
 1652 Release 3.1 (1987).
 1653 La versione in System V Release 4 (1989) ha aggiunto alcune nuove funzionalit@`a
 1654 e ha fatto pulizia nel comportamento di alcuni degli ``punti oscuri'' del
 1655 linguaggio.  Le specifiche per @command{awk} nello standard POSIX Command
 1656 Language and Utilities ha in seguito reso pi@`u chiaro il linguaggio.  Sia i
 1657 progettisti di @command{gawk} che quelli dell'originale @command{awk} dei Bell
 1658 Laboratories hanno collaborato alla formulazione delle specifiche POSIX.
 1659 
 1660 @cindex Rubin, Paul
 1661 @cindex Fenlason, Jay
 1662 @cindex Trueman, David
 1663 Paul Rubin ha scritto @command{gawk}, nel 1986.
 1664 Jay Fenlason l'ha completata, seguendo i consigli di Richard Stallman.
 1665 Anche John Woods ha fornito parti del codice.  Nel 1988 e 1989, David Trueman,
 1666 col mio aiuto, ha rivisto completamente @command{gawk} per la compatibilit@`a
 1667 col pi@`u recente @command{awk}.
 1668 Intorno al 1994, sono divenuto il manutentore principale.
 1669 Lo sviluppo corrente @`e incentrato sulla correzione degli errori, sul
 1670 miglioramento delle prestazioni, sulla conformit@`a agli standard e,
 1671 occasionalmente, su nuove funzionalit@`a.
 1672 
 1673 Nel maggio 1997, J@"urgen Kahrs avvert@`{@dotless{i}} la necessit@`a di un accesso alla
 1674 rete da @command{awk}, e con un piccolo aiuto da parte mia, cominci@`o ad
 1675 aggiungere funzionalit@`a a @command{gawk} per fare questo.  A quel tempo,
 1676 lui scrisse anche il grosso di
 1677 @cite{@value{GAWKINETTITLE}}
 1678 (un documento separato, disponibile come parte della distribuzione
 1679 @command{gawk}).  Il suo codice alla fine venne integrato nella distribuzione
 1680 principale di @command{gawk} con la versione 3.1 di @command{gawk}.
 1681 
 1682 John Haque ha riscritto la parte interna di @command{gawk}, mentre metteva a
 1683 punto un debugger a livello di @command{awk}.  Questa versione divenne
 1684 disponibile come @command{gawk} versione 4.0 nel 2011.
 1685 
 1686 @xref{Contributori}
 1687 per un elenco completo di quelli che hanno fornito contributi importanti a
 1688 @command{gawk}.
 1689 
 1690 @node Nomi
 1691 @unnumberedsec Una rosa, con ogni altro nome...
 1692 
 1693 @cindex @command{awk} @subentry nuovo e vecchio
 1694 Il linguaggio @command{awk} si @`e evoluto nel corso degli anni.  Tutti i
 1695 dettagli si trovano in @ref{Storia del linguaggio}.
 1696 Il linguaggio descritto in questo @value{DOCUMENT}
 1697 viene spesso citato come ``nuovo @command{awk}''.
 1698 Per analogia, la versione originale di @command{awk} @`e citata
 1699 come ``vecchio @command{awk}.''
 1700 
 1701 Su molti sistemi di uso corrente, eseguendo il programma di utilit@`a
 1702 @command{awk}, si invoca qualche versione del nuovo
 1703 @command{awk}.@footnote{Solo i sistemi Solaris usano ancora un
 1704 vecchio @command{awk} per il programma di utilit@`a predefinito
 1705 @command{awk}. Una versione pi@`u moderna di @command{awk} si trova
 1706 nella directory @file{/usr/xpg6/bin} su questi sistemi.} Se
 1707 il comando @command{awk} nel sistema in uso @`e il vecchio, il
 1708 risultato che vedrete per il programma di test che segue @`e
 1709 del tipo:
 1710 
 1711 @example
 1712 $ @kbd{awk 1 /dev/null}
 1713 @group
 1714 @error{} awk: syntax error near line 1
 1715 @error{} awk: bailing out near line 1
 1716 @end group
 1717 @end example
 1718 
 1719 @noindent
 1720 Se questo @`e il caso, dovreste cercare una versione del nuovo @command{awk},
 1721 o semplicemente installare @command{gawk}!
 1722 
 1723 All'interno di questo @value{DOCUMENT}, quando si fa riferimento a
 1724 funzionalit@`a del linguaggio che dovrebbe essere disponibile in ogni
 1725 implementazione completa di @command{awk} POSIX, viene usato il termine
 1726 @command{awk}.  Quando si fa riferimento a una funzionalit@`a specifica
 1727 dell'implementazione GNU, viene usato i termine @command{gawk}.
 1728 
 1729 @node Questo manuale
 1730 @unnumberedsec Uso di questo @value{DOCUMENT}
 1731 @cindex @command{awk} @subentry descrizione dei termini
 1732 
 1733 Il termine @command{awk} si riferisce sia a uno specifico programma sia al
 1734 linguaggio che si usa per dire al programma stesso cosa deve fare.  Quando dobbiamo
 1735 essere precisi, chiamiamo il linguaggio ``il linguaggio @command{awk},''
 1736 e il programma ``l'utilit@`a @command{awk}.''
 1737 Questo @value{DOCUMENT} spiega
 1738 sia come scrivere programmi nel linguaggio @command{awk} che come
 1739 eseguire l'utilit@`a @command{awk}.
 1740 Il termine ``programma @command{awk}'' si riferisce a un programma scritto
 1741 dall'utente nel linguaggio di programmazione @command{awk}.
 1742 
 1743 @cindex @command{gawk} @subentry @command{awk} e
 1744 @cindex @command{awk} @subentry @command{gawk} e
 1745 @cindex POSIX @command{awk}
 1746 In primo luogo, questo @value{DOCUMENT} spiega le funzionalit@`a di @command{awk}
 1747 come definite nello standard POSIX, e lo fa nel contesto dell'implementazione
 1748 @command{gawk}.  Oltre a questo, cerca anche di descrivere le differenze
 1749 significative tra @command{gawk}
 1750 e altre
 1751 @ifclear FOR_PRINT
 1752 implementazioni @command{awk}.@footnote{Tutte queste differenze
 1753 si trovano nell'indice alla
 1754 voce ``differenze tra @command{awk} e @command{gawk}.''}
 1755 @end ifclear
 1756 @ifset FOR_PRINT
 1757 implementazioni @command{awk}.
 1758 @end ifset
 1759 Infine, vien fatta rilevare ogni funzionalit@`a di @command{gawk} non
 1760 inclusa nello standard POSIX per @command{awk}.
 1761 
 1762 @ifnotinfo
 1763 Questo @value{DOCUMENT} ha il difficile compito di essere sia una guida
 1764 introduttiva che un manuale di riferimento.  I neofiti possono
 1765 tranquillamente saltare i dettagli che sembrano loro troppo complessi.
 1766 Possono anche ignorare i molti riferimenti incrociati, preparati avendo in
 1767 mente gli utenti esperti e per le versioni Info e
 1768 @uref{https://www.gnu.org/software/gawk/manual/, HTML}
 1769 del @value{DOCUMENT}.
 1770 @end ifnotinfo
 1771 
 1772 Ci sono dei riquadri
 1773 sparsi in tutto il @value{DOCUMENT}.
 1774 Aggiungono una spiegazione pi@`u completa su punti importanti, ma che
 1775 probabilmente non sono di interesse in sede di prima lettura.
 1776 @ifclear FOR_PRINT
 1777 Si trovano tutti nell'indice analitico, alla voce ``riquadro.''
 1778 @end ifclear
 1779 
 1780 La maggior parte delle volte, gli esempi usano programmi @command{awk} completi.
 1781 Alcune delle @value{SECTIONS} pi@`u avanzate mostrano solo la parte del programma
 1782 @command{awk} che illustra il concetto che si sta descrivendo.
 1783 
 1784 Sebbene questo @value{DOCUMENT} sia destinato soprattutto alle persone che non
 1785 hanno una precedente conoscenza di @command{awk}, esso contiene anche tante
 1786 informazioni che anche gli esperti di @command{awk} troveranno utili.
 1787 In particolare, dovrebbero essere d'interesse la descrizione di POSIX
 1788 @command{awk} e i programmi di esempio
 1789 @ifnottex
 1790 in
 1791 @end ifnottex
 1792 @iftex
 1793 nel
 1794 @end iftex
 1795 @ref{Funzioni di libreria} e
 1796 @ifnotdocbook
 1797 @ifnottex
 1798 in
 1799 @end ifnottex
 1800 @end ifnotdocbook
 1801 @iftex
 1802 nel
 1803 @end iftex
 1804 @ref{Programmi di esempio}.
 1805 
 1806 Questo @value{DOCUMENT} @`e suddiviso in diverse parti, come segue:
 1807 
 1808 @c FULLXREF ON
 1809 
 1810 @itemize @value{BULLET}
 1811 @item
 1812 La Parte I descrive il linguaggio @command{awk} e il programma @command{gawk}
 1813 nel dettaglio.
 1814 Inizia con le nozioni di base, e continua con tutte le caratteristiche di
 1815 @command{awk}.  Contiene i seguenti capitoli:
 1816 
 1817 @c nested
 1818 @itemize @value{MINUS}
 1819 @item
 1820 @ref{Per iniziare},
 1821 fornisce le nozioni minime indispensabili per iniziare a usare @command{awk}.
 1822 
 1823 @item
 1824 @ref{Invocare Gawk},
 1825 descrive come eseguire @command{gawk}, il significato delle sue
 1826 opzioni da riga di comando e come trovare i file sorgenti del programma
 1827 @command{awk}.
 1828 
 1829 @item
 1830 @ref{Espressioni regolari},
 1831 introduce le espressioni regolari in generale, e in particolare le variet@`a
 1832 disponibili in @command{awk} POSIX e @command{gawk}.
 1833 
 1834 @item
 1835 @ref{Leggere file},
 1836 descrive come @command{awk} legge i dati inseriti dall'utente.
 1837 Introduce i concetti di record e campi, e anche il
 1838 comando @code{getline}.
 1839 Contiene una prima descrizione della ridirezione I/O, e una breve descrizione
 1840 dell'I/O di rete.
 1841 
 1842 @item
 1843 @ref{Stampare},
 1844 descrive come i programmi @command{awk} possono produrre output con
 1845 @code{print} e @code{printf}.
 1846 
 1847 @item
 1848 @ref{Espressioni},
 1849 descrive le espressioni, che sono i componenti elementari di base
 1850 per portare a termine la maggior parte delle operazioni in un programma.
 1851 
 1852 @item
 1853 @ref{Criteri di ricerca e azioni},
 1854 descrive come scrivere espressioni di ricerca per individuare corrispondenze nei
 1855 record, le azioni da eseguire quando si @`e trovata una corrispondenza
 1856 in un record, e le variabili predefinite di @command{awk} e
 1857 @command{gawk}.
 1858 
 1859 @item
 1860 @ref{Vettori},
 1861 tratta dell'unica struttura di dati di @command{awk}: il vettore associativo.
 1862 Vengono trattati anche l'eliminazione di elementi del vettore e di interi
 1863 vettori, e l'ordinamento dei vettori in @command{gawk}.
 1864 Il @value{CHAPTER} descrive inoltre come @command{gawk} fornisce vettori di
 1865 vettori.
 1866 
 1867 @item
 1868 @ref{Funzioni},
 1869 descrive le funzioni predefinite fornite da @command{awk} e
 1870 @command{gawk}, e spiega come definire funzioni personalizzate.  Viene
 1871 anche spiegato come @command{gawk} permetta di invocare funzioni in
 1872 maniera indiretta.
 1873 @end itemize
 1874 
 1875 @item
 1876 La Parte II illustra come usare @command{awk} e @command{gawk} per la
 1877 risoluzione di problemi. Qui ci sono molti programmi da leggere e da cui imparare.
 1878 Questa parte contiene i seguenti capitoli:
 1879 
 1880 @c nested
 1881 @itemize @value{MINUS}
 1882 @item
 1883 @ref{Funzioni di libreria},
 1884 fornisce diverse funzioni pensate per
 1885 essere usate dai programmi scritti in @command{awk}.
 1886 
 1887 @item
 1888 @ref{Programmi di esempio},
 1889 fornisce molti programmi @command{awk} di esempio.
 1890 @end itemize
 1891 
 1892 La lettura di questi due capitoli permette di capire come
 1893 @command{awk} pu@`o risolvere problemi pratici.
 1894 
 1895 @item
 1896 La Parte III si concentra sulle funzionalit@`a specifiche di @command{gawk}.
 1897 Contiene i seguenti capitoli:
 1898 
 1899 @c nested
 1900 @itemize @value{MINUS}
 1901 @item
 1902 @ref{Funzionalit@`a avanzate},
 1903 descrive diverse funzionalit@`a avanzate.
 1904 Di particolare rilevanza sono
 1905 la capacit@`a di controllare l'ordine di visita dei vettori,
 1906 quella di instaurare comunicazioni bidirezionali con altri processi,
 1907 di effettuare connessioni di rete TCP/IP, e di
 1908 profilare i propri programmi @command{awk}.
 1909 
 1910 @item
 1911 @ref{Internazionalizzazione},
 1912 descrive funzionalit@`a speciali per tradurre i messaggi
 1913 di programma in diverse lingue in fase di esecuzione.
 1914 
 1915 @item
 1916 @ref{Debugger}, descrive il debugger di @command{gawk}.
 1917 
 1918 @item
 1919 @ref{Spazi-dei-nomi}, descrive come @command{gawk} permette
 1920 che variabili e/o funzioni con lo stesso nome coesistano
 1921 in distinti spazi-dei-nomi (@dfn{spazi-dei-nomi}).
 1922 
 1923 @item
 1924 @ref{Calcolo con precisione arbitraria},
 1925 illustra le capacit@`a di calcolo avanzate.
 1926 
 1927 @item
 1928 @ref{Estensioni dinamiche},
 1929 descrive come aggiungere nuove variabili e
 1930 funzioni a @command{gawk} scrivendo estensioni in C o C++.
 1931 @end itemize
 1932 
 1933 @item
 1934 @ifclear FOR_PRINT
 1935 La Parte IV contiene le appendici, il Glossario, e due licenze relative,
 1936 rispettivamente, al codice sorgente di @command{gawk} e a questo
 1937 @value{DOCUMENT}.  Contiene le seguenti appendici:
 1938 @end ifclear
 1939 
 1940 @ifset FOR_PRINT
 1941 La Parte IV contiene le seguenti appendici,
 1942 che includono la  Licenza per Documentazione Libera GNU:
 1943 @end ifset
 1944 
 1945 @itemize @value{MINUS}
 1946 @item
 1947 @ref{Storia del linguaggio},
 1948 descrive l'evoluzione del linguaggio @command{awk} dalla sua prima versione
 1949 fino a oggi.  Descrive anche come @command{gawk}
 1950 ha acquisito nuove funzionalit@`a col passare del tempo.
 1951 
 1952 @item
 1953 @ref{Installazione},
 1954 descrive come ottenere @command{gawk}, come compilarlo
 1955 sui sistemi compatibili con POSIX,
 1956 e come compilarlo e usarlo su diversi sistemi
 1957 non conformi allo standard POSIX.  Spiega anche come segnalare gli errori
 1958 di @command{gawk} e dove si possono ottenere altre implementazioni
 1959 di @command{awk} liberamente disponibili.
 1960 
 1961 @ifset FOR_PRINT
 1962 @item
 1963 @ref{Copia},
 1964 presenta la licenza applicabile al codice sorgente @command{gawk}.
 1965 @end ifset
 1966 
 1967 @ifclear FOR_PRINT
 1968 @item
 1969 @ref{Note},
 1970 descrive come disabilitare le estensioni @command{gawk},
 1971 come contribuire scrivendo del nuovo codice per @command{gawk},
 1972 e alcune possibili direzioni per il futuro sviluppo di @command{gawk}.
 1973 
 1974 @item
 1975 @ref{Concetti fondamentali},
 1976 fornisce del materiale di riferimento a livello elementare per chi
 1977 sia completamente digiuno di programmazione informatica.
 1978 
 1979 @item
 1980 Il @ref{Glossario}, definisce quasi tutti i termini significativi
 1981 usati all'interno di questo @value{DOCUMENT}.  Se si incontrano termini
 1982 coi quali non si ha familiarit@`a, questo @`e il posto dove cercarli.
 1983 
 1984 @item
 1985 @ref{Copia}, e
 1986 @ref{Licenza per Documentazione Libera GNU (FDL)},
 1987 presentano le licenze che si applicano, rispettivamente, al codice sorgente
 1988 di @command{gawk} e a questo @value{DOCUMENT}.
 1989 @end ifclear
 1990 @end itemize
 1991 @end itemize
 1992 
 1993 @ifset FOR_PRINT
 1994 La versione di questo @value{DOCUMENT} distribuita con @command{gawk}
 1995 contiene ulteriori appendici e altro materiale.
 1996 Per ragioni di spazio, per questa edizione a stampa abbiamo tralasciato alcune
 1997 delle appendici. Si possono trovare in rete ai seguenti indirizzi:
 1998 
 1999 @itemize @value{BULLET}
 2000 @item
 2001 @uref{https://www.gnu.org/software/gawk/manual/html_node/Notes.html,
 2002 L'appendice sulle note di implementazione}
 2003 descrive come disabilitare le estensioni @command{gawk}, come contribuire
 2004 scrivendo del nuovo codice per @command{gawk}, dove reperire informazioni
 2005 su alcune possibili future direzioni dello sviluppo di @command{gawk}, e
 2006 sulle decisioni di progetto che hanno influito sulle estensioni API.
 2007 
 2008 @item
 2009 @uref{https://www.gnu.org/software/gawk/manual/html_node/Basic-Concepts.html,
 2010 L'appendice sui concetti fondamentali}
 2011 fornisce del materiale di riferimento a livello elementare per chi sia completamente a
 2012 digiuno di programmazione informatica.
 2013 
 2014 @item
 2015 @uref{https://www.gnu.org/software/gawk/manual/html_node/Glossary.html,
 2016 Il Glossario}
 2017 definisce la maggior parte, o quasi, dei termini significativi usati
 2018 nel corso del libro.  Se si incontrano termini con cui non si ha familiarit@`a,
 2019 questo @`e il posto dove cercarli.
 2020 
 2021 @item
 2022 @uref{https://www.gnu.org/software/gawk/manual/html_node/GNU-Free-Documentation-License.html, la licenza GNU FDL}
 2023 @`e la licenza che vale per questo @value{DOCUMENT}.
 2024 @end itemize
 2025 
 2026 @c ok not to use CHAPTER / SECTION here
 2027 Alcuni dei capitoli hanno sezioni con esercizi; queste sono anche
 2028 state omesse dall'edizione a stampa ma sono disponibili online.
 2029 @end ifset
 2030 
 2031 @c FULLXREF OFF
 2032 
 2033 @node Convenzioni
 2034 @unnumberedsec Convenzioni tipografiche
 2035 
 2036 @cindex Texinfo
 2037 Questo @value{DOCUMENT} @`e scritto in @uref{https://www.gnu.org/software/texinfo/, Texinfo},
 2038 il linguaggio di formattazione della documentazione GNU.  Viene usato un unico
 2039 file sorgente Texinfo per produrre sia la versione a stampa della documentazione
 2040 sia quella online.
 2041 @ifnotinfo
 2042 A causa di ci@`o, le convenzioni tipografiche
 2043 sono leggermente diverse da quelle presenti in altri libri che potete aver letto.
 2044 @end ifnotinfo
 2045 @ifinfo
 2046 Questo @value{SECTION} documenta brevemente le convenzioni tipografiche usate in Texinfo.
 2047 @end ifinfo
 2048 
 2049 Gli esempi da immettere sulla riga di comando sono preceduti dai
 2050 comuni prompt di shell primario e secondario, rispettivamente
 2051 @samp{$} e @samp{>}.
 2052 L'input che si inserisce viene mostrato @kbd{in questo modo}.
 2053 @c 8/2014: @print{} is stripped from the texi to make docbook.
 2054 @ifclear FOR_PRINT
 2055 L'output del comando @`e  preceduto dal glifo ``@print{}'', che
 2056 in genere rappresenta lo standard output del comando.
 2057 @end ifclear
 2058 @ifset FOR_PRINT
 2059 L'output del comando, normalmente il suo standard output, @`e stampato
 2060 @code{in questo modo}.
 2061 @end ifset
 2062 Messaggi di errore e altri output sullo standard error del comando sono
 2063 preceduti dal glifo ``@error{}''.  Per esempio:
 2064 
 2065 @example
 2066 $ @kbd{echo ciao su stdout}
 2067 @print{} ciao su stdout
 2068 $ @kbd{echo salve su stderr 1>&2}
 2069 @error{} salve su stderr
 2070 @end example
 2071 
 2072 @ifnotinfo
 2073 Nel testo, quasi tutto ci@`o che riguarda la programmazione,
 2074 per esempio i nomi dei comandi,
 2075 appare in @code{questo font}. I frammenti
 2076 di codice appaiono nello stesso font e tra apici, @samp{in questo modo}.
 2077 Ci@`o che viene sostituito dall'utente o dal programmatore
 2078 appare in @var{questo font}.
 2079 Le opzioni sono stampate cos@`{@dotless{i}}: @option{-f}.
 2080 I @value{FNS} sono indicati in questo modo: @file{/percorso/al/file}.
 2081 @ifclear FOR_PRINT
 2082 Certe cose sono
 2083 evidenziate @emph{in questo modo}, e se un punto dev'essere reso in modo pi@`u
 2084 marcato, viene evidenziato @strong{in questo modo}.
 2085 @end ifclear
 2086 La prima occorrenza di un
 2087 nuovo termine @`e usualmente la sua @dfn{definizione} e appare nello stesso
 2088 font della precedente occorrenza di ``definizione'' in questa frase.
 2089 @end ifnotinfo
 2090 
 2091 I caratteri che si battono sulla tastiera sono scritti come @kbd{questi}.  In
 2092 particolare, ci sono caratteri speciali chiamati ``caratteri di controllo''.
 2093 Questi sono caratteri che vengono battuti tenendo premuti il tasto
 2094 @kbd{CONTROL} e un altro tasto contemporaneamente.
 2095 Per esempio, @kbd{Ctrl-d} @`e battuto premendo e tenendo premuto il tasto
 2096 @kbd{CONTROL}, poi premendo il tasto @kbd{d} e infine rilasciando entrambi i
 2097 tasti.
 2098 
 2099 Per amor di brevit@`a, in questo @value{DOCUMENT}, la versione di Brian
 2100 Kernighan di @command{awk} sar@`a citata come ``BWK @command{awk}.''
 2101 (@xref{Altre versioni} per informazioni su questa e altre versioni.)
 2102 
 2103 @ifset FOR_PRINT
 2104 @quotation NOTA
 2105 Note interessanti sono stampate in questo modo.
 2106 @end quotation
 2107 
 2108 @quotation ATTENZIONE
 2109 Note di avviso o raccomandazioni di cautela sono stampate in questo modo.
 2110 @end quotation
 2111 @end ifset
 2112 
 2113 @c fakenode --- for prepinfo
 2114 @unnumberedsubsec Angoli Bui
 2115 @cindex Kernighan, Brian
 2116 @quotation
 2117 @i{Gli angoli bui sono essenzialmente frattali --- per quanto vengano
 2118 illuminati, ce n'@`e sempre uno pi@`u piccolo e pi@`u buio.}
 2119 @author Brian Kernighan
 2120 @end quotation
 2121 
 2122 @cindex a.b. @seeentry{angolo buio}
 2123 @cindex angolo buio
 2124 Fino allo standard POSIX (e @cite{@value{TITLE}}),
 2125 molte caratteristiche di @command{awk} erano poco documentate o
 2126 non documentate affatto.  Le descrizioni di queste caratteristiche
 2127 (chiamate spesso ``angoli bui'') sono segnalate in questo @value{DOCUMENT} con
 2128 @iftex
 2129 il disegno di una torcia elettrica nel margine, come mostrato qui.
 2130 @value{DARKCORNER}
 2131 @end iftex
 2132 @ifnottex
 2133 ``(a.b.)''.
 2134 @end ifnottex
 2135 @ifclear FOR_PRINT
 2136 Appaiono anche nell'indice sotto la voce ``angolo buio.''
 2137 @end ifclear
 2138 
 2139 Ma come osservato nella citazione d'apertura, ogni trattazione degli
 2140 angoli bui @`e per definizione incompleta.
 2141 
 2142 @cindex e.c. @seeentry{estensioni comuni}
 2143 Estensioni al linguaggio standard di @command{awk} disponibili in pi@`u di una
 2144 implementazione di @command{awk} sono segnate
 2145 @ifclear FOR_PRINT
 2146 ``@value{COMMONEXT},'' ed elencate nell'indice sotto ``estensioni comuni''
 2147 e ``comuni, estensioni''.
 2148 @end ifclear
 2149 @ifset FOR_PRINT
 2150 ``@value{COMMONEXT}'' per ``estensioni comuni.''
 2151 @end ifset
 2152 
 2153 @node Storia del manuale
 2154 @unnumberedsec Breve storia del Progetto GNU e di questo @value{DOCUMENT}
 2155 
 2156 @cindex FSF (Free Software Foundation)
 2157 @cindex Free Software Foundation (FSF)
 2158 @cindex Stallman, Richard
 2159 La Free Software Foundation (FSF) @`e un'organizzazione senza scopo di lucro
 2160 dedita alla produzione e distribuzione di software liberamente distribuibile.
 2161 @`E stata fondata da Richard M.@: Stallman, l'autore della prima versione
 2162 dell'editor Emacs.  GNU Emacs @`e oggi la versione di Emacs pi@`u largamente usata.
 2163 
 2164 @cindex progetto @subentry GNU
 2165 @cindex GNU @subentry progetto
 2166 @cindex GPL (General Public License)
 2167 @cindex General Public License @seeentry{GPL}
 2168 @cindex documentazione @subentry online
 2169 Il Progetto GNU@footnote{GNU sta per ``GNU's Not Unix.''}
 2170 @`e un progetto della Free Software
 2171 Foundation in continuo sviluppo per creare un ambiente per computer completo, liberamente
 2172 distribuibile, conforme allo standard POSIX.
 2173 La FSF usa la GNU General Public License (GPL) per assicurare che
 2174 il codice sorgente del loro software sia sempre
 2175 disponibile all'utente finale.
 2176 @ifclear FOR_PRINT
 2177 Una copia della GPL @`e inclusa
 2178 @ifnotinfo
 2179 in questo @value{DOCUMENT}
 2180 @end ifnotinfo
 2181 per la consultazione
 2182 (@pxref{Copia}).
 2183 @end ifclear
 2184 La GPL si applica al codice sorgente in linguaggio C per @command{gawk}.
 2185 Per saperne di pi@`u sulla FSF e sul Progetto GNU,
 2186 si veda @uref{https://www.gnu.org, la pagina principale del Progetto GNU}.
 2187 Questo @value{DOCUMENT} si pu@`o leggere anche dal
 2188 @uref{https://www.gnu.org/software/gawk/manual/, sito di GNU}.
 2189 
 2190 @ifclear FOR_PRINT
 2191 Una shell, un editor (Emacs), compilatori ottimizzanti C, C++ e
 2192 Objective-C altamente portabili, un debugger simbolico e dozzine di grandi e
 2193 piccoli programmi di utilit@`a (come @command{gawk}), sono stati completati e
 2194 sono liberamente disponibili.  Il kernel del sistema operativo GNU (noto come
 2195 HURD), @`e stato rilasciato ma @`e ancora allo stato di sviluppo iniziale.
 2196 
 2197 @cindex GNU/Linux
 2198 @cindex sistemi operativi @subentry basati su BSD
 2199 In attesa che il sistema operativo GNU venga pi@`u completatamente
 2200 sviluppato, si dovrebbe prendere in considerazione l'uso di GNU/Linux, un
 2201 sistema operativo liberamente distribuibile e basato su Unix disponibile
 2202 per Intel, Power Architecture,
 2203 Sun SPARC, IBM S/390, e altri
 2204 sistemi.@footnote{La terminologia ``GNU/Linux'' @`e spiegata
 2205 nel @ref{Glossario}.}
 2206 Molte distribuzioni GNU/Linux sono
 2207 scaricabili da internet.
 2208 @end ifclear
 2209 
 2210 @ifnotinfo
 2211 Il @value{DOCUMENT} @`e realmente libero --- almeno, l'informazione che contiene
 2212 @`e libera per chiunque ---.  Il codice sorgente del @value{DOCUMENT}, leggibile
 2213 elettronicamente, viene fornito con @command{gawk}.
 2214 @ifclear FOR_PRINT
 2215 (Dare un'occhiata alla Free Documentation
 2216 License in @ref{Licenza per Documentazione Libera GNU (FDL)}.)
 2217 @end ifclear
 2218 @end ifnotinfo
 2219 
 2220 @cindex Close, Diane
 2221 Il @value{DOCUMENT} in s@'e ha gi@`a avuto parecchie edizioni in passato.
 2222 Paul Rubin ha scritto la prima bozza di @cite{The GAWK Manual};, che era
 2223 lunga una quarantina di pagine.
 2224 Diane Close e Richard Stallman l'hanno migliorata arrivando alla
 2225 versione che era
 2226 lunga una novantina di pagine, e descriveva solo la versione originale
 2227 ``vecchia'' di @command{awk}.
 2228 Ho iniziato a lavorare con quella versione nell'autunno del 1988.
 2229 Mentre ci stavo lavorando,
 2230 la FSF ha pubblicato parecchie versioni preliminari, numerate 0.@var{x}).
 2231 Nel 1996, l'edizione 1.0 fu rilasciata assieme a @command{gawk} 3.0.0.
 2232 La FSF ha pubblicato le prime due edizioni col
 2233 titolo @cite{GAWK: The GNU Awk User's Guide}.
 2234 @ifset FOR_PRINT
 2235 SSC ha pubblicato due edizioni del @value{DOCUMENT} col
 2236 titolo @cite{Effective awk Programming}, e O'Reilly ha pubblicato
 2237 la terza edizione nel 2001
 2238 @end ifset
 2239 
 2240 Questa edizione mantiene la struttura di base delle edizioni precedenti.
 2241 Per l'edizione FSF 4.0, il contenuto era stato accuratamente rivisto
 2242 e aggiornato.  Tutti i riferimenti a versioni di @command{gawk} anteriori alla
 2243 versione 4.0 sono stati eliminati.
 2244 Di particolare interesse in quella edizione era l'aggiunta del @ref{Debugger}.
 2245 
 2246 Per l'edizione FSF
 2247 @ifclear FOR_PRINT
 2248 5.0,
 2249 @end ifclear
 2250 @ifset FOR_PRINT
 2251 @value{EDITION}
 2252 (la quarta edizione, come pubblicata da O'Reilly),
 2253 @end ifset
 2254 il contenuto @`e stato riorganizzato in parti,
 2255 e le aggiunte pi@`u importanti sono
 2256 @iftex
 2257 il
 2258 @end iftex
 2259 @ref{Calcolo con precisione arbitraria}, e
 2260 @iftex
 2261 il
 2262 @end iftex
 2263 @ref{Estensioni dinamiche}.
 2264 
 2265 Questo @value{DOCUMENT} continuer@`a certamente ad evolversi.  Se si trovano
 2266 errori nel @value{DOCUMENT}, si prega di segnalarli! @xref{Bug}
 2267 per informazioni su come inviare le segnalazione di problemi elettronicamente.
 2268 @ifset FOR_PRINT
 2269 @node Restare aggiornati
 2270 @unnumberedsec Come restare aggiornati
 2271 
 2272 Potreste avere una versione di @command{gawk} pi@`u recente di quella
 2273 descritta qui.  Per vedere cosa @`e cambiato,
 2274 dovreste prima guardare il file @file{NEWS} nella distribuzione di
 2275 @command{gawk}, che fornisce un sommario ad alto livello dei
 2276 cambiamenti in ciascuna versione.
 2277 
 2278 @`E poi possibile consultare la @uref{https://www.gnu.org/software/gawk/manual/,
 2279 versione online} di questo @value{DOCUMENT} per informazioni su eventuali
 2280 nuove funzionalit@`a.
 2281 @end ifset
 2282 
 2283 @ifclear FOR_PRINT
 2284 @node Come contribuire
 2285 @unnumberedsec Come collaborare
 2286 
 2287 Come manutentore di GNU @command{awk}, un tempo pensai che sarei stato in grado
 2288 di gestire una raccolta di programmi @command{awk} pubblicamente disponibili e
 2289 avevo anche esortato a collaborare.  Rendere disponibili le cose su Internet
 2290 aiuta a contenere la distribuzione @command{gawk} entro dimensioni gestibili.
 2291 
 2292 L'iniziale raccolta di materiale, cos@`{@dotless{i}} com'@`e, @`e tuttora disponibile
 2293 su @uref{ftp://ftp.freefriends.org/arnold/Awkstuff}.
 2294 
 2295 Nella speranza di fare qualcosa di pi@`u generale, ho acuisito il dominio
 2296 @code{awklang.org}.  A fine anno 2017 un volontario si @`e assunto il compito
 2297 di gestirlo.
 2298 
 2299 Se qualcuno ha scritto un programma @command{awk} interessante, o
 2300 un'estensione a @command{gawk} che vuole condividere col resto del mondo,
 2301 @`e invitato a consultare la pagina @uref{http://www.awklang.org} e a usare
 2302 il puntatore ``Contact''.
 2303 
 2304 Se qualcuno ha scritto un'estensione a @command{gawk}, si veda
 2305 @ref{gawkextlib}.
 2306 
 2307 @end ifclear
 2308 
 2309 @node Ringraziamenti
 2310 @unnumberedsec Ringraziamenti
 2311 
 2312 La bozza iniziale di @cite{The GAWK Manual} riportava i seguenti ringraziamenti:
 2313 
 2314 @quotation
 2315 Molte persone devono essere ringraziate per la loro assistenza nella produzione
 2316 di questo manuale.  Jay Fenlason ha contribuito con molte idee e programmi di
 2317 esempio.  Richard Mlynarik e Robert Chassell hanno fatto utili osservazioni
 2318 sulle bozze di questo manuale.  Lo scritto
 2319 @cite{A Supplemental Document for AWK} di John W.@: Pierce, del
 2320 Chemistry Department di UC San Diego, fa il punto su diverse questioni rilevanti
 2321 sia per l'implementazione di @command{awk} che per questo manuale, che
 2322 altrimenti ci sarebbero sfuggite.
 2323 @end quotation
 2324 
 2325 @cindex Stallman, Richard
 2326 Vorrei ringraziare Richard M.@: Stallman, per la sua visione di un mondo
 2327 migliore e per il suo coraggio nel fondare la FSF e nel dare inizio al
 2328 Progetto GNU.
 2329 
 2330 @ifclear FOR_PRINT
 2331 Edizioni precedenti di questo @value{DOCUMENT} riportavano i seguenti
 2332 ringraziamenti:
 2333 @end ifclear
 2334 @ifset FOR_PRINT
 2335 La precedente edizione di questo @value{DOCUMENT} riportava
 2336 i seguenti ringraziamenti:
 2337 @end ifset
 2338 
 2339 @quotation
 2340 Le seguenti persone (in ordine alfabetico)
 2341 hanno inviato commenti utili riguardo alle diverse
 2342 versioni di questo libro:
 2343 Rick Adams,
 2344 Dr.@: Nelson H.F. Beebe,
 2345 Karl Berry,
 2346 Dr.@: Michael Brennan,
 2347 Rich Burridge,
 2348 Claire Cloutier,
 2349 Diane Close,
 2350 Scott Deifik,
 2351 Christopher (``Topher'') Eliot,
 2352 Jeffrey Friedl,
 2353 Dr.@: Darrel Hankerson,
 2354 Michal Jaegermann,
 2355 Dr.@: Richard J.@: LeBlanc,
 2356 Michael Lijewski,
 2357 Pat Rankin,
 2358 Miriam Robbins,
 2359 Mary Sheehan,
 2360 e
 2361 Chuck Toporek.
 2362 
 2363 @cindex Berry, Karl
 2364 @cindex Chassell, Robert J.@:
 2365 @c @cindex Texinfo
 2366 Robert J.@: Chassell ha dato preziosissimi consigli
 2367 sull'uso di Texinfo.
 2368 Merita anche un particolare ringraziamento per avermi
 2369 convinto a @emph{non} dare a questo @value{DOCUMENT}
 2370 il titolo @cite{How to Gawk Politely}. [Un gioco di parole in inglese che pu@`o
 2371 significare sia
 2372 @cite{Come usare Gawk educatamente}
 2373 che @cite{Come curiosare educatamente}].
 2374 Karl Berry ha aiutato in modo significativo con la parte @TeX{} di Texinfo.
 2375 
 2376 @cindex Hartholz @subentry Marshall
 2377 @cindex Hartholz @subentry Elaine
 2378 @cindex Schreiber @subentry Bert
 2379 @cindex Schreiber @subentry Rita
 2380 Vorrei ringraziare Marshall ed Elaine Hartholz di Seattle e il Dr.@: Bert e Rita
 2381 Schreiber di Detroit per i lunghi periodi di vacanza trascorsi in tutta
 2382 tranquillit@`a in casa loro, che mi hanno permesso di fare importanti progressi
 2383 nella scrittura di questo @value{DOCUMENT} e con lo stesso @command{gawk}.
 2384 
 2385 @cindex Hughes, Phil
 2386 Phil Hughes di SSC
 2387 ha contribuito in modo molto importante prestandomi il suo portatile col sistema
 2388 GNU/Linux, non una volta, ma due, il che mi ha permesso di fare tantissimo lavoro
 2389 mentre ero fuori casa.
 2390 
 2391 @cindex Trueman, David
 2392 David Trueman merita un riconoscimento speciale; ha fatto un lavoro da sentinella
 2393 durante lo sviluppo di @command{gawk} affinch@'e funzioni bene e senza errori.
 2394 Sebbene non sia pi@`u impegnato con @command{gawk},
 2395 lavorare con lui a questo progetto @`e stato un vero piacere.
 2396 
 2397 @cindex Drepper, Ulrich
 2398 @cindex GNITS mailing list
 2399 @cindex mailing list @subentry GNITS
 2400 Gli intrepidi membri della lista GNITS, con una particolare menzione per Ulrich
 2401 Drepper, hanno fornito un aiuto prezioso e commenti per il progetto
 2402 delle funzionalit@`a di internazionalizzazione.
 2403 
 2404 Chuck Toporek, Mary Sheehan, e Claire Cloutier della O'Reilly & Associates hanno
 2405 fornito un'assistenza editoriale rilevante per questo @value{DOCUMENT} per la
 2406 versione 3.1 di @command{gawk}.
 2407 @end quotation
 2408 
 2409 @cindex Beebe, Nelson H.F.@:
 2410 @cindex Buening, Andreas
 2411 @cindex Collado, Manuel
 2412 @cindex Colombo, Antonio
 2413 @cindex Davies, Stephen
 2414 @cindex Deifik, Scott
 2415 @cindex Demaille, Akim
 2416 @cindex G., Daniel Richard
 2417 @cindex Guerrero, Juan Manuel
 2418 @cindex Hankerson, Darrel
 2419 @cindex Jaegermann, Michal
 2420 @cindex Kahrs, J@"urgen
 2421 @cindex Kasal, Stepan
 2422 @cindex Malmberg, John
 2423 @cindex Pitts, Dave
 2424 @cindex Ramey, Chet
 2425 @cindex Rankin, Pat
 2426 @cindex Schorr, Andrew
 2427 @cindex Vinschen, Corinna
 2428 @cindex Zaretskii, Eli
 2429 
 2430 Dr.@: Nelson Beebe,
 2431 Andreas Buening,
 2432 Dr.@: Manuel Collado,
 2433 Antonio Colombo,
 2434 Stephen Davies,
 2435 Scott Deifik,
 2436 Akim Demaille,
 2437 Daniel Richard G.,
 2438 Juan Manuel Guerrero,
 2439 Darrel Hankerson,
 2440 Michal Jaegermann,
 2441 J@"urgen Kahrs,
 2442 Stepan Kasal,
 2443 John Malmberg,
 2444 Chet Ramey,
 2445 Pat Rankin,
 2446 Andrew Schorr,
 2447 Corinna Vinschen,
 2448 ed Eli Zaretskii
 2449 (in ordine alfabetico)
 2450 costituiscono l'attuale ``gruppo di lavoro sulla portabilit@`a'' di
 2451 @command{gawk}.  Senza il loro duro lavoro e il loro aiuto,
 2452 @command{gawk} non sarebbe stato neanche lontanamente il buon programma che @`e
 2453 oggi.  @`E stato e continua a essere un piacere lavorare con questo gruppo
 2454 di ottimi collaboratori.
 2455 
 2456 Notevoli contributi di codice e documentazione sono arrivati da
 2457 parecchie persone. @xref{Contributori} per l'elenco completo.
 2458 
 2459 @ifset FOR_PRINT
 2460 @cindex Oram, Andy
 2461 Grazie ad Andy Oram della O'Reilly Media per aver iniziato
 2462 la quarta edizione e per il suo aiuto in corso d'opera.
 2463 Grazie a Jasmine Kwityn per il suo lavoro di revisione.
 2464 @end ifset
 2465 
 2466 Grazie a Michael Brennan per le Prefazioni.
 2467 
 2468 @cindex Duman, Patrice
 2469 @cindex Berry, Karl
 2470 @cindex Smith, Gavin
 2471 Grazie a Patrice Dumas per il nuovo programma @command{makeinfo}.
 2472 Grazie a Karl Berry, che per il lavoro svolto in passato
 2473 su Texinfo, e a Gavin Smith, che continua a lavorare per
 2474 migliorare il linguaggio di marcatura Texinfo.
 2475 
 2476 @cindex Kernighan, Brian
 2477 @cindex Brennan, Michael
 2478 @cindex Day, Robert P.J.@:
 2479 Robert P.J.@: Day, Michael Brennan e Brian Kernighan hanno gentilmente
 2480 fatto da revisiori per l'edizione 2015 di questo @value{DOCUMENT}.  Le loro
 2481 osservazioni hanno contribuito a migliorare la stesura finale.
 2482 
 2483 Vorrei ringraziare Brian Kernighan per la sua preziosa assistenza durante
 2484 la fase di collaudo e di debug di @command{gawk} e
 2485 per l'aiuto in corso d'opera e i consigli nel chiarire diversi punti sul
 2486 linguaggio.  Non avremmo proprio fatto un cos@`{@dotless{i}} buon lavoro su @command{gawk} e
 2487 sulla sua documentazione senza il suo aiuto.
 2488 
 2489 Brian @`e un fuoriclasse sia come programmatore che come autore di manuali
 2490 tecnici.  @`E mio dovere ringraziarlo (una volta di pi@`u) per la sua costante
 2491 amicizia e per essere stato per me un modello da seguire ormai per oltre
 2492 30 anni!  Averlo come revisiore @`e per me un privilegio eccitante, ma @`e
 2493 stata anche un'esperienza che mi ha fatto sentire molto piccolo@enddots{}
 2494 
 2495 @cindex Robbins @subentry Miriam
 2496 @cindex Robbins @subentry Jean
 2497 @cindex Robbins @subentry Harry
 2498 @cindex D-o
 2499 Devo ringraziare la mia meravigliosa moglie, Miriam, per la sua pazienza nel
 2500 corso delle molte versioni di questo progetto, per la correzione delle bozze e
 2501 per aver condiviso con me il computer.
 2502 Vorrei ringraziare i miei genitori per il loro amore, e per la gentilezza con cui
 2503 mi hanno cresciuto ed educato.
 2504 Infine, devo riconoscere la mia gratitudine a D-o, per le molte opportunit@`a
 2505 che mi ha offerto, e anche per i doni che mi ha elargito, con cui trarre
 2506 vantaggio da quelle opportunit@`a.
 2507 @ifnotdocbook
 2508 @sp 2
 2509 @noindent
 2510 Arnold Robbins @*
 2511 Nof Ayalon @*
 2512 Israel @*
 2513 Marzo 2020
 2514 @end ifnotdocbook
 2515 
 2516 @ifnotinfo
 2517 @part @value{PART1}Il Linguaggio @command{awk}
 2518 @end ifnotinfo
 2519 
 2520 @ifdocbook
 2521 @part Il Linguaggio @command{awk}
 2522 
 2523 La Parte I descrive il linguaggio @command{awk} e il programma @command{gawk}
 2524 nel dettaglio.  Inizia con le nozioni di base, e continua con tutte le
 2525 funzionalit@`a di @command{awk}.  Sono incluse anche molte, ma non tutte, le
 2526 funzionalit@`a di @command{gawk}.  Questa parte contiene i
 2527 seguenti capitoli:
 2528 
 2529 @itemize @value{BULLET}
 2530 @item
 2531 @ref{Per iniziare}
 2532 
 2533 @item
 2534 @ref{Invocare Gawk}
 2535 
 2536 @item
 2537 @ref{Espressioni regolari}
 2538 
 2539 @item
 2540 @ref{Leggere file}
 2541 
 2542 @item
 2543 @ref{Stampare}
 2544 
 2545 @item
 2546 @ref{Espressioni}
 2547 
 2548 @item
 2549 @ref{Modelli e azioni}
 2550 
 2551 @item
 2552 @ref{Vettori}
 2553 
 2554 @item
 2555 @ref{Funzioni}
 2556 @end itemize
 2557 @end ifdocbook
 2558 @node Per iniziare
 2559 @chapter Per iniziare con @command{awk}
 2560 @c @cindex script, definition of
 2561 @c @cindex rule, definition of
 2562 @c @cindex program, definition of
 2563 @c @cindex basic function of @command{awk}
 2564 @cindex @command{awk} @subentry utilizzo di
 2565 
 2566 Il compito fondamentale di @command{awk} @`e quello di ricercare righe (o
 2567 altre unit@`a di testo) in file che corrispondano a certi criteri di ricerca.
 2568 Quando una riga corrisponde a uno dei criteri, @command{awk} esegue su
 2569 quella riga le azioni specificate per quel criterio.  @command{awk} continua
 2570 a elaborare righe in input in questo modo, finch@'e non raggiunge la fine delle
 2571 righe nei file in input.
 2572 
 2573 @cindex @command{awk} @subentry uso di
 2574 @cindex linguaggi di programmazione @subentry guidati-dai-dati vs. procedurali
 2575 @cindex programmi @command{awk}
 2576 I programmi scritti in @command{awk} sono differenti dai programmi scritti
 2577 nella maggior parte degli altri linguaggi,
 2578 poich@'e i programmi @command{awk} sono @dfn{guidati dai dati} (ovvero,
 2579 richiedono di descrivere i dati sui quali si vuole operare, e in seguito
 2580 che cosa fare una volta che tali dati siano stati individuati).
 2581 La maggior parte degli altri linguaggi sono @dfn{procedurali}; si deve
 2582 descrivere, in maniera molto dettagliata, ogni passo che il programma
 2583 deve eseguire.  Lavorando con linguaggi procedurali, solitamente @`e
 2584 molto pi@`u difficile descrivere chiaramente i dati che il programma
 2585 deve elaborare.
 2586 Per questa ragione i programmi @command{awk} sono spesso piacevolmente
 2587 facili da leggere e da scrivere.
 2588 
 2589 @cindex programma @subentry definizione di
 2590 @cindex regola @subentry definizione di
 2591 Quando si esegue @command{awk}, va specificato un
 2592 @dfn{programma} @command{awk} che
 2593 dice ad @command{awk} cosa fare.  Il programma consiste di una serie di
 2594 @dfn{regole} (pu@`o anche contenere @dfn{definizioni di funzioni},
 2595 una funzionalit@`a avanzata che per ora ignoreremo;
 2596 @pxref{Funzioni definite dall'utente}).  Ogni regola specifica un
 2597 criterio di ricerca e un'azione da effettuare
 2598 una volta che viene trovato un record corrispondente.
 2599 
 2600 Sintatticamente, una regola consiste in un @dfn{criterio di ricerca}, seguito
 2601 da una @dfn{azione}.
 2602 L'azione @`e racchiusa tra parentesi graffe per separarla dal criterio di
 2603 ricerca.
 2604 Per separare regole, basta andare a capo.  Quindi un programma
 2605 @command{awk} ha una struttura simile a questa:
 2606 
 2607 @example
 2608 @var{criterio} @{ @var{azione} @}
 2609 @var{criterio} @{ @var{azione} @}
 2610 @dots{}
 2611 @end example
 2612 
 2613 @menu
 2614 * Eseguire gawk::               Come iniziare a eseguire programmi
 2615                                 @command{gawk}; comprende la sintassi
 2616                                 della riga di comando.
 2617 * File dati di esempio::        File di dati di esempio da usare nei
 2618                                 programmi @command{awk} illustrati in
 2619                                 questo @value{DOCUMENT}.
 2620 * Molto semplice::              Un esempio molto semplice.
 2621 * Due regole::                  Un esempio meno semplice di programma
 2622                                 di una riga, che usa due regole.
 2623 * Maggiore sofisticazione::     Un esempio pi@`u complesso.
 2624 * Istruzioni/Righe::            Suddividere o riunire istruzioni
 2625                                 su [una o pi@`u] righe.
 2626 * Altre funzionalit@`a::        Altre funzionalit@`a di @command{awk}.
 2627 * Quando::                      Quando usare @command{gawk} e quando
 2628                                 usare altre cose.
 2629 * Sommario dell'introduzione::  Sommario dell'introduzione.
 2630 @end menu
 2631 
 2632 @node Eseguire gawk
 2633 @section Come iniziare a eseguire programmi @command{gawk}
 2634 
 2635 @cindex programmi @command{awk} @subentry eseguire
 2636 Ci sono vari modi di eseguire un programma @command{awk}.  Se il programma @`e
 2637 corto, @`e pi@`u facile includerlo nel comando con cui si invoca @command{awk},
 2638 cos@`{@dotless{i}}:
 2639 
 2640 @example
 2641 awk '@var{programma}' @var{input-file1} @var{input-file2} @dots{}
 2642 @end example
 2643 
 2644 @cindex riga di comando @subentry formati
 2645 Quando il programma @`e lungo, di solito @`e meglio metterlo in un file
 2646 ed eseguirlo con un comando come questo:
 2647 
 2648 @example
 2649 awk -f @var{file-di-programma} @var{input-file1} @var{input-file2} @dots{}
 2650 @end example
 2651 
 2652 @ifnotinfo
 2653 Questa
 2654 @end ifnotinfo
 2655 @ifinfo
 2656 Questo
 2657 @end ifinfo
 2658 @value{SECTION} si occupa di entrambe queste modalit@`a insieme
 2659 a parecchie varianti di ciascuna di esse.
 2660 
 2661 @menu
 2662 * Monouso::                             Eseguire un breve programma
 2663                                         @command{awk} di tipo usa-e-getta.
 2664 * Leggere dal terminale::               Senza uso di file in input (input
 2665                                         immesso da tastiera).
 2666 * Lunghi::                              Mettere programmi @command{awk}
 2667                                         permanenti in file.
 2668 * @dfn{Script} eseguibili::             Preparare programmi @command{awk}
 2669                                         da eseguire come @dfn{script}.
 2670 * Commenti::                            Aggiungere documentazione a programmi
 2671                                         @command{gawk}.
 2672 * Protezione::                          Ulteriore discussione di problemi
 2673                                         connessi all'uso di apici nella shell.
 2674 @end menu
 2675 
 2676 @node Monouso
 2677 @subsection Eseguire un breve programma @command{awk} usa-e-getta
 2678 
 2679 Una volta acquisita familiarit@`a con @command{awk}, capiter@`a spesso di
 2680 preparare semplici
 2681 programmi nel momento in cui servono.  In questo caso si pu@`o scrivere
 2682 il programma come primo argomento del comando @command{awk}, cos@`{@dotless{i}}:
 2683 
 2684 @example
 2685 awk '@var{programma}' @var{input-file1} @var{input-file2} @dots{}
 2686 @end example
 2687 
 2688 @noindent
 2689 dove @var{programma} consiste in una serie di criteri di ricerca e di
 2690 azioni, come descritto precedentemente.
 2691 
 2692 @cindex apice singolo (@code{'})
 2693 @cindex @code{'} (apice singolo)
 2694 Questo formato di comando chiede alla @dfn{shell}, ossia all'interpretatore
 2695 dei comandi, di richiamare @command{awk} e di usare il @var{programma} per
 2696 trattare record nei file in input.
 2697 Il @var{programma} @`e incluso tra apici in modo che
 2698 la shell non interpreti qualche carattere destinato ad @command{awk} come
 2699 carattere speciale
 2700 della shell.  Gli apici fanno inoltre s@`{@dotless{i}} che la shell tratti tutto il
 2701 @var{programma} come un solo argomento per @command{awk}, e permettono che
 2702 @var{programma} sia pi@`u lungo di una riga.
 2703 
 2704 @cindex shell @subentry @dfn{script}
 2705 @cindex programmi @command{awk} @subentry eseguire @subentry da @dfn{script} di shell
 2706 Questo formato @`e utile anche per eseguire programmi @command{awk} di
 2707 dimensioni piccole o medie da @dfn{script} di shell, perch@'e non richiede
 2708 un file separato che contenga il programma @command{awk}.  Uno @dfn{script}
 2709 di shell @`e pi@`u affidabile, perch@'e non ci sono altri file che possono
 2710 venirsi a trovare fuori posto.
 2711 
 2712 Pi@`u avanti in questo capitolo,
 2713 @iftex
 2714 nella
 2715 @end iftex
 2716 @ifnottex
 2717 in
 2718 @end ifnottex
 2719 @ifdocbook
 2720 @value{SECTION}
 2721 @end ifdocbook
 2722 @ref{Molto semplice},
 2723 si vedranno esempi di parecchi programmi,
 2724 brevi, scritti sulla riga di comando.
 2725 
 2726 @node Leggere dal terminale
 2727 @subsection Senza uso di file in input (input immesso da tastiera)
 2728 
 2729 @cindex standard input
 2730 @cindex input @subentry standard
 2731 @cindex input @subentry eseguire @command{awk} senza usare
 2732 Si pu@`o anche eseguire @command{awk} senza indicare alcun file in input.  Se
 2733 si immette la seguente riga di comando:
 2734 
 2735 @example
 2736 awk '@var{programma}'
 2737 @end example
 2738 
 2739 @noindent
 2740 @command{awk} prende come input del @var{programma} lo @dfn{standard input},
 2741 che di solito significa qualsiasi cosa venga immesso dalla tastiera.
 2742 Ci@`o prosegue finch@'e non si segnala una fine-file battendo @kbd{Ctrl-d}.
 2743 (In sistemi operativi non-POSIX, il carattere di fine-file pu@`o essere diverso.)
 2744 
 2745 @cindex input @subentry eseguire @command{awk} senza usare
 2746 @cindex programmi @command{awk} @subentry eseguire @subentry senza file in input
 2747 Per esempio, il seguente programma stampa un consiglio da amico
 2748 (dalla @cite{Guida galattica per gli autostoppisti} di Douglas Adams ),
 2749 per non lasciarsi spaventare dalle complessit@`a della programmazione per
 2750 computer:
 2751 
 2752 @example
 2753 $ @kbd{awk 'BEGIN @{ print "Non v\47allarmate!" @}'}
 2754 @print{} Non v'allarmate!
 2755 @end example
 2756 
 2757 @command{awk} esegue le istruzioni associate a @code{BEGIN} prima di leggere
 2758 qualsiasi input.  Se non ci sono altre istruzioni nel proprio programma, come
 2759 in questo caso, @command{awk} si ferma, invece di tentare di leggere input che
 2760 non sa come elaborare.
 2761 Il @samp{\47} @`e un modo straordinario (spiegato pi@`u avanti) per inserire un
 2762 apice singolo nel programma, senza dover ricorrere a fastidiosi meccanismi
 2763 di protezione della shell.
 2764 
 2765 @quotation NOTA
 2766 Se si usa Bash come shell, si dovrebbe digitare il comando @samp{set +H} prima
 2767 eseguire questo programma interattivamente, per non avere una cronologia dei
 2768 comandi nello stile della C shell, che tratta il @samp{!} come un carattere
 2769 speciale.  Si raccomanda di inserire quel comando nel proprio file di
 2770 personalizzazione della shell.
 2771 @end quotation
 2772 
 2773 Il seguente semplice programma @command{awk}
 2774 emula il comando @command{cat}; ovvero copia qualsiasi cosa si
 2775 batta sulla tastiera nel suo standard output (perch@'e succede @`e spiegato fra
 2776 poco):
 2777 
 2778 @example
 2779 $ @kbd{awk '@{ print @}'}
 2780 @kbd{Ora @`e il tempo per tutti gli uomini buoni}
 2781 @print{} Ora @`e il tempo per tutti gli uomini buoni
 2782 @kbd{di venire in aiuto al loro paese.}
 2783 @print{} di venire in aiuto al loro paese.
 2784 @kbd{Or sono sedici lustri e sette anni, ...}
 2785 @print{} Or sono sedici lustri e sette anni, ...
 2786 @kbd{Cosa, io preoccupato?}
 2787 @print{} Cosa, io preoccupato?
 2788 @kbd{Ctrl-d}
 2789 @end example
 2790 
 2791 @node Lunghi
 2792 @subsection Eseguire programmi lunghi
 2793 
 2794 @cindex programmi @command{awk} @subentry eseguire
 2795 @cindex programmi @command{awk} @subentry lunghi
 2796 @cindex programmi @command{awk} @subentry in file
 2797 @cindex file @subentry programmi @command{awk} in
 2798 Talora i programmi @command{awk} sono molto lunghi.  In tali situazioni
 2799 conviene mettere il programma in un file separato.  Per dire ad
 2800 @command{awk} di usare quel file come programma, digitare:
 2801 
 2802 @example
 2803 awk -f @var{file-sorgente} @var{input-file1} @var{input-file2} @dots{}
 2804 @end example
 2805 
 2806 @cindex @option{-f} (opzione)
 2807 @cindex opzione @subentry @option{-f}
 2808 @cindex riga di comando @subentry opzione @option{-f}
 2809 L'opzione @option{-f} dice al comando @command{awk} di ottenere il programma
 2810 @command{awk} dal file @var{file-sorgente} (@pxref{Opzioni}).
 2811 Ogni @value{FN} pu@`o essere usato come @var{file-sorgente}.  Per esempio, si
 2812 potrebbe mettere il programma:
 2813 
 2814 @example
 2815 BEGIN @{ print \"Non v'allarmate!\" @}
 2816 @end example
 2817 
 2818 @noindent
 2819 nel file @file{consiglio}.  Allora questo comando:
 2820 
 2821 @example
 2822 awk -f consiglio
 2823 @end example
 2824 
 2825 @noindent
 2826 equivale al comando:
 2827 
 2828 @example
 2829 awk 'BEGIN @{ print \"Non v\47allarmate!\" @}'
 2830 @end example
 2831 
 2832 @cindex protezione @subentry nella riga di comando di @command{gawk}
 2833 @noindent
 2834 Questo @`e gi@`a stato spiegato prima
 2835 (@pxref{Leggere dal terminale}).
 2836 Si noti che normalmente non serve mettere apici singoli nel @value{FN} che si
 2837 fornisce con @option{-f}, perch@'e di solito i @value{FNS} non contengono
 2838 caratteri che sono speciali per la shell.  Si noti che in @file{consiglio},
 2839 il programma @command{awk} non ha dei doppi apici che lo delimitano.  I
 2840 doppi apici sono necessari solo per programmi scritti direttamente sulla riga
 2841 di comando di @command{awk}.
 2842 (Inoltre, se il programma si trova in un file, @`e possibile usare un apice
 2843 singolo all'interno del programma, invece del magico @samp{\47}.)
 2844 
 2845 @cindex apice singolo (@code{'}) @subentry nella riga di comando di @command{gawk}
 2846 @cindex @code{'} (apice singolo) @subentry nella riga di comando di @command{gawk}
 2847 Per identificare chiaramente un file di programma @command{awk} come tale,
 2848 si pu@`o aggiungere il suffisso @file{.awk} al @value{FN}.  Ci@`o non
 2849 cambia l'esecuzione del programma @command{awk} ma semplifica
 2850 la ``manutenzione''.
 2851 
 2852 @node @dfn{Script} eseguibili
 2853 @subsection Programmi @command{awk} da eseguire come @dfn{script}
 2854 @cindex programmi @command{awk}
 2855 @cindex @code{#} (cancelletto) @subentry @code{#!} (@dfn{script} eseguibili)
 2856 @cindex Unix @subentry @dfn{script} @command{awk} e
 2857 @cindex cancelletto (@code{#}) @subentry @code{#!} (@dfn{script} eseguibili)
 2858 
 2859 Una volta familiarizzato con @command{awk}, si potrebbero scrivere
 2860 @dfn{script} che richiamano @command{awk}, usando il meccanismo di
 2861 @dfn{script} @samp{#!}.  Ci@`o @`e
 2862 possibile in molti sistemi operativi.@footnote{Il meccanismo @samp{#!}
 2863 funziona nei sistemi
 2864 GNU/Linux, in quelli basati su BSD e nei sistemi Unix a pagamento.}
 2865 Per esempio, si potrebbe modificare il file @file{consiglio} e farlo divenire:
 2866 
 2867 @example
 2868 #! /bin/awk -f
 2869 
 2870 BEGIN @{ print \"Non v'allarmate!\" @}
 2871 @end example
 2872 
 2873 @noindent
 2874 Dopo aver reso eseguibile questo file (con il comando @command{chmod}),
 2875 digitare semplicemente @samp{consiglio}
 2876 al prompt della shell e il sistema si preparer@`a a eseguire @command{awk}
 2877 come se si fosse digitato @samp{awk -f consiglio}:
 2878 
 2879 @example
 2880 $ @kbd{chmod +x consiglio}
 2881 $ @kbd{./consiglio}
 2882 @print{} Non v'allarmate!
 2883 @end example
 2884 
 2885 @noindent
 2886 @dfn{Script} @command{awk} autocontenuti sono utili se si vuol scrivere un
 2887 programma che gli utenti possono richiamare senza dover essere informati che
 2888 il programma @`e scritto in @command{awk}.
 2889 
 2890 @sidebar Comprendere @samp{#!}
 2891 @cindex portabilit@`a @subentry @code{#!} (@dfn{script} eseguibili)
 2892 
 2893 @command{awk} @`e un linguaggio @dfn{interpretato}.  Ci@`o significa che il
 2894 comando @command{awk} legge il programma dell'utente e poi elabora i dati
 2895 secondo le istruzioni contenute nel programma (diversamente da un linguaggio
 2896 @dfn{compilato} come il C, dove il programma viene prima compilato in codice
 2897 macchina che @`e eseguito direttamente dal processore del sistema).  Il
 2898 programma di utilit@`a @command{awk} @`e perci@`o chiamato @dfn{interpretatore}.
 2899 Molti linguaggi moderni sono interpretati.
 2900 
 2901 La riga che inizia con @samp{#!} lista l'intero @value{FN} di un
 2902 interpretatore
 2903 da richiamare, con degli argomenti opzionali che saranno passati a
 2904 quell'interpretatore sulla riga di comando.  Il sistema operativo quindi
 2905 richiama l'interpretatore con gli argomenti dati e con l'intera lista di
 2906 argomenti con cui era stato invocato il programma.  Il primo argomento nella
 2907 lista @`e l'intero @value{FN} del programma @command{awk}.  Il resto della lista
 2908 degli argomenti contiene opzioni per  @command{awk}, oppure @value{DF}, o
 2909 entrambi.  (Si noti che in molti sistemi @command{awk} si trova in
 2910 @file{/usr/bin} invece che in @file{/bin}.)
 2911 
 2912 Alcuni sistemi limitano la lunghezza del nome del programma interpretarore a
 2913 32 caratteri.  Spesso, si pu@`o rimediare utilizzando un collegamento simbolico.
 2914 
 2915 Non si dovrebbero mettere altri argomenti oltre al primo nella riga @samp{#!}
 2916 dopo il percorso del comando @command{awk}.  Non funziona.  Il sistema
 2917 operativo tratta il resto della riga come un argomento solo, e lo passa ad
 2918 @command{awk}.
 2919 Cos@`{@dotless{i}} facendo il comportamento sar@`a poco chiaro; con ogni
 2920 probabilit@`a verr@`a emesso un
 2921 messaggio di errore di qualche tipo da @command{awk}.
 2922 
 2923 @cindex variabile @subentry @code{ARGC}/@code{ARGV} @subentry portabilit@`a e
 2924 @cindex portabilit@`a @subentry variabile @code{ARGV}
 2925 @cindex angolo buio @subentry @code{ARGV}, valore della variabile
 2926 @cindex angolo buio @subentry variabile @subentry @code{ARGV}, valore
 2927 Infine, il valore di @code{ARGV[0]}
 2928 (@pxref{Variabili predefinite})
 2929 pu@`o variare a seconda del sistema operativo.
 2930 Alcuni sistemi ci mettono @samp{awk}, altri il nome completo del percorso
 2931 di @command{awk} (ad. es. @file{/bin/awk}), e altri ancora mettono il nome
 2932 dello @dfn{script} dell'utente (@samp{consiglio}).  @value{DARKCORNER}
 2933 Non bisogna fidarsi del valore di @code{ARGV[0]}
 2934 per ottenere il nome del proprio @dfn{script}.
 2935 @end sidebar
 2936 
 2937 @node Commenti
 2938 @subsection Documentare programmi @command{gawk}.
 2939 @cindex @code{#} (cancelletto) @subentry commentare
 2940 @cindex cancelletto (@code{#}) @subentry commentare
 2941 @cindex commenti
 2942 @cindex programmi @command{awk} @subentry documentazione dei
 2943 
 2944 Un @dfn{commento} @`e del testo incluso in un programma per aiutare le
 2945 persone che lo leggeranno; non @`e parte del programma eseguibile vero e
 2946 proprio.  I commenti possono spiegare cosa fa il programma e come funziona.
 2947 Quasi tutti i linguaggi di programmazione possono contenere commenti, poich@'e
 2948 i programmi sono solitamente difficili da comprendere senza di essi.
 2949 
 2950 Nel linguaggio @command{awk}, un commento inizia con il segno del
 2951 cancelletto (@samp{#}) e continua fino alla fine della riga.
 2952 Il @samp{#} non deve necessariamente essere il primo carattere della riga.
 2953 Il linguaggio @command{awk} ignora il resto di una riga dopo il carattere
 2954 cancelletto.
 2955 Per esempio, potremmo mettere quel che segue in @file{consiglio}:
 2956 
 2957 @example
 2958 # Questo programma stampa uno scherzoso consiglio amichevole.
 2959 # Aiuta a far passare la paura del computer agli utenti novelli.
 2960 BEGIN    @{ print "Non v'allarmate!" @}
 2961 @end example
 2962 
 2963 Si possono mettere dei commenti nei programmi @command{awk} usa-e-getta da
 2964 digitare direttamente da tastiera, ma ci@`o solitmanete non serve molto; il
 2965 fine di un commento @`e di aiutare l'utente o qualcun altro a comprendere il
 2966 programma, quando lo rilegge in un secondo tempo.
 2967 
 2968 @cindex protezione @subentry per piccoli programmi awk
 2969 @cindex apice singolo (@code{'}) @subentry vs.@: apostrofo
 2970 @cindex @code{'} (apice singolo) @subentry vs.@: apostrofo
 2971 @quotation ATTENZIONE
 2972 Come detto in
 2973 @ref{Monouso},
 2974 si possono includere programmi di dimensioni da piccole a medie tra apici
 2975 singoli, per mantenere compatti i propri @dfn{script} di shell
 2976 autocontenuti.  Nel far questo, @emph{non} bisogna inserire un apostrofo
 2977 (ossia un apice singolo) in un commento, (o in qualsiasi altra parte del
 2978 vostro programma).  La shell interpreta gli apici singoli come delimitatori
 2979 di chiusura dell'intero programma.  Di conseguenza, solitamente la shell
 2980 emette un messaggio riguardo ad apici presenti in numero dispari, e se
 2981 @command{awk} viene comunque eseguito, @`e probabile che stampi strani
 2982 messaggi di errori di sintassi.
 2983 Per esempio, nel caso seguente:
 2984 
 2985 @example
 2986 $ @kbd{awk 'BEGIN @{ print "Ciao" @} # un'idea brillante'}
 2987 >
 2988 @end example
 2989 
 2990 La shell considera il secondo apice singolo come delimitatore del testo
 2991 precedente, e trova che un nuovo testo tra apici ha inizio verso la fine
 2992 della riga di comando.  A causa di ci@`o emette una richiesta secondaria di
 2993 input, e si mette in attesa di ulteriore input.
 2994 Con il comando @command{awk} Unix, se si chiude l'ulteriore stringa tra
 2995 apici singoli il risultato @`e il seguente:
 2996 
 2997 @example
 2998 $ @kbd{awk '@{ print "Ciao" @} # un'idea brillante'}
 2999 > @kbd{'}
 3000 @error{} awk: fatale: non riesco ad aprire file `brillante'
 3001 @error{}              in lettura (File o directory non esistente)
 3002 @end example
 3003 
 3004 @cindex @code{\} (barra inversa)
 3005 @cindex barra inversa (@code{\})
 3006 Mettere una barra inversa prima dell'apice singolo in @samp{un'idea} non
 3007 risolverebbe, poich@'e le barre inverse non sono speciali all'interno di apici
 3008 singoli.
 3009 La prossima @value{SUBSECTION} descrive le regole di protezione della shell.
 3010 @end quotation
 3011 
 3012 @node Protezione
 3013 @subsection Uso di apici nella shell.
 3014 @cindex shell @subentry protezione @subentry regole per
 3015 
 3016 @menu
 3017 * Doppi apici in DOS::              Passaggio di apici in file .BAT Windows.
 3018 @end menu
 3019 
 3020 Per programmi @command{awk} di lunghezza da corta a media spesso conviene
 3021 digitare il programma sulla riga di comando @command{awk}.
 3022 La maniera migliore per farlo @`e racchiudere l'intero programma tra apici
 3023 singoli.
 3024 Questo vale sia che si digiti il programma interattivamente su
 3025 richiesta della shell, sia che lo si scriva come parte di uno @dfn{script}
 3026 di shell di maggiori dimensioni:
 3027 
 3028 @example
 3029 awk '@var{testo del programma}' @var{input-file1} @var{input-file2} @dots{}
 3030 @end example
 3031 
 3032 @cindex shell @subentry protezione @subentry regole per
 3033 @cindex Bourne shell @subentry protezione @subentry regole per la
 3034 Quando si lavora con la shell, non guasta avere una conoscenza
 3035 di base sulle regole per l'uso di apici nella shell.  Le regole
 3036 seguenti valgono solo per shell in stile Bourne (come Bash, la
 3037 Bourne-Again shell).  Se si usa la C shell, si avranno regole differenti.
 3038 
 3039 Prima di immergerci nelle regole, introduciamo un concetto che ricorre
 3040 in tutto questo @value{DOCUMENT}, che @`e quello della stringa @dfn{null},
 3041 o vuota.
 3042 
 3043 La stringa nulla @`e una variabile, di tipo carattere, che non ha un valore.
 3044 In altre parole, @`e vuota.  Nei programmi @command{awk} si scrive cos@`{@dotless{i}}:
 3045 @code{""}.  Nella shell la si pu@`o scrivere usando apici sia singoli
 3046 che doppi: @code{""} oppure @code{''}.  Sebbena la stringa nulla non contenga
 3047 alcun carattere, essa esiste lo stesso.  Si consideri questo comando:
 3048 
 3049 @example
 3050 $ @kbd{echo ""}
 3051 @end example
 3052 
 3053 @noindent
 3054 Qui, il comando @command{echo} riceve un solo argomento, anche se
 3055 quell'argomento non contiene alcun carattere.  Nel resto di questo
 3056 @value{DOCUMENT}, usiamo indifferentemente i termini @dfn{stringa nulla}
 3057 e @dfn{stringa vuota}.  Ora, proseguiamo con le regole relative agli apici:
 3058 
 3059 
 3060 @itemize @value{BULLET}
 3061 @item
 3062 Elementi tra apici possono essere concatenati con elementi non tra apici.
 3063 La shell converte il tutto in un singolo argomento da passare
 3064 al comando.
 3065 
 3066 @item
 3067 Mettere una barra inversa (@samp{\}) prima di qualsiasi singolo carattere
 3068 lo protegge.  La shell toglie la barra inversa e passa il carattere
 3069 protetto al comando.
 3070 
 3071 @item
 3072 @cindex @code{\} (barra inversa) @subentry nei comandi di shell
 3073 @cindex barra inversa (@code{\}) @subentry nei comandi di shell
 3074 @cindex apice singolo (@code{'}) @subentry nei comandi di shell
 3075 @cindex @code{'} (apice singolo) @subentry nei comandi di shell
 3076 Gli apici singoli proteggono qualsiasi cosa sia inclusa tra un apice di
 3077 apertura e uno di chiusura.
 3078 La shell non interpreta il testo protetto, il quale viene passato cos@`{@dotless{i}} com'@`e
 3079 al comando.
 3080 @`E @emph{impossibile} inserire un apice singolo in un testo racchiuso fra
 3081 apici singoli.  Potete trovare in
 3082 @ref{Commenti}
 3083 un esempio di cosa succede se si prova a farlo.
 3084 
 3085 @item
 3086 @cindex doppio apice (@code{"}) @subentry nei comandi shell
 3087 @cindex @code{"} (doppio apice) @subentry nei comandi shell
 3088 I doppi apici proteggono la maggior parte di quel che @`e racchiuso tra i
 3089 doppi apici di apertura e quelli di chiusura.
 3090 La shell effettua almeno la sostituzione di variabili e di comandi
 3091 sul testo racchiuso tra doppi apici.
 3092 Shell differenti possono fare ulteriori tipi di elaborazione
 3093 sul testo racchiuso tra doppi apici.
 3094 
 3095 Poich@'e alcuni caratteri all'interno di un testo racchiuso tra doppi apici
 3096 sono interpretati dalla shell, essi devono essere @dfn{protetti} all'interno
 3097 del testo stesso.  Sono da tener presenti i caratteri
 3098 @samp{$}, @samp{`}, @samp{\}, e @samp{"}, tutti i quali devono essere
 3099 preceduti da una barra inversa quando ricorrono all'interno di un testo
 3100 racchiuso tra doppi apici, per poter essere passati letteralmente al
 3101 programma.  (La barra inversa viene tolta prima del passaggio al programma.)
 3102 Quindi, l'esempio visto
 3103 @ifnotinfo
 3104 precedentemente
 3105 @end ifnotinfo
 3106 in @ref{Leggere dal terminale}:
 3107 
 3108 @example
 3109 awk 'BEGIN @{ print "Non v\47allarmate!" @}'
 3110 @end example
 3111 
 3112 @noindent
 3113 si potrebbe scrivere invece cos@`{@dotless{i}}:
 3114 
 3115 @example
 3116 $ @kbd{awk "BEGIN @{ print \"Non v'allarmate!\" @}"}
 3117 @print{} Non v'allarmate!
 3118 @end example
 3119 
 3120 @cindex apice singolo (@code{'}) @subentry con doppio apice
 3121 @cindex @code{'} (apice singolo) @subentry con doppio apice
 3122 Va notato che l'apice singolo non @`e speciale all'interno di un testo
 3123 racchiuso tra doppi apici.
 3124 
 3125 @item
 3126 Le stringhe nulle sono rimosse se presenti come parte di un argomento
 3127 non-nullo sulla riga di comando, mentre oggetti esplicitamente nulli
 3128 sono mantenuti come tali.
 3129 Per esempio, per richiedere che il separatore di campo @code{FS} sia
 3130 impostato alla stringa nulla, digitare:
 3131 
 3132 @example
 3133 awk -F "" '@var{programma}' @var{file} # corretto
 3134 @end example
 3135 
 3136 @noindent
 3137 @cindex stringa nulla @subentry come argomento a @command{gawk}, protezione della
 3138 Non @`e invece da usare:
 3139 
 3140 @example
 3141 awk -F"" '@var{programma}' @var{file}  # errato!
 3142 @end example
 3143 
 3144 @noindent
 3145 Nel secondo caso, @command{awk} tenta di usare il nome del programma come
 3146 valore di @code{FS}, e il primo @value{FN} come testo del programma!
 3147 Ci@`o come minimo genera un errore di sintassi, e un comportamento confuso nel
 3148 caso peggiore.
 3149 @end itemize
 3150 
 3151 @cindex protezione @subentry nella riga di comando di @command{gawk} @subentry trucchi per la
 3152 Mischiare apici singoli e doppi @`e difficile.  Occorre utilizzare
 3153 trucchi della shell per gli apici, come questi:
 3154 
 3155 @example
 3156 $ @kbd{awk 'BEGIN @{ print "Questo @`e un apice singolo. <'"'"'>" @}'}
 3157 @print{} Questo @`e un apice singolo. <'>
 3158 @end example
 3159 
 3160 @noindent
 3161 Questo programma stampa tre stringhe tra apici concatenate tra loro.
 3162 La prima e la terza sono rinchiuse tra apici singoli, la seconda tra apici
 3163 doppi.
 3164 
 3165 Quanto sopra pu@`o essere ``semplificato'' cos@`{@dotless{i}}:
 3166 
 3167 @example
 3168 $ @kbd{awk 'BEGIN @{ print "Questo @`e un apice singolo <'\''>" @}'}
 3169 @print{} Questo @`e un apice singolo <'>
 3170 @end example
 3171 
 3172 @noindent
 3173 A voi la scelta del pi@`u leggibile dei due.
 3174 
 3175 Un'altra opzione @`e quella di usare doppi apici, proteggendo i doppi apici
 3176 inclusi, a livello @command{awk}:
 3177 
 3178 @example
 3179 $ @kbd{awk "BEGIN @{ print \"Questo @`e un apice singolo <'>\" @}"}
 3180 @print{} Questo @`e un apice singolo <'>
 3181 @end example
 3182 
 3183 @noindent
 3184 Quest'opzione @`e fastidiosa anche perch@'e il doppio apice, la barra inversa e
 3185 il simbolo del dollaro sono molto comuni nei programmi @command{awk} pi@`u
 3186 avanzati.
 3187 
 3188 Una terza opzione @`e quella di usare le sequenze ottali equivalenti
 3189 (@pxref{Sequenze di protezione})
 3190 per i caratteri
 3191 apice singolo e doppio, cos@`{@dotless{i}}:
 3192 
 3193 @example
 3194 @group
 3195 $ @kbd{awk 'BEGIN @{ print "Questo @`e un apice singolo <\47>" @}'}
 3196 @print{} Questo @`e un apice singolo <'>
 3197 $ @kbd{awk 'BEGIN @{ print "Questo @`e un doppio apice <\42>" @}'}
 3198 @print{} Questo @`e un doppio apice <">
 3199 @end group
 3200 @end example
 3201 
 3202 @noindent
 3203 Questo funziona bene, ma si dovrebbe commentare chiaramente quel che
 3204 la sequenza di protezione significa.
 3205 
 3206 Una quarta possibilit@`a @`e di usare assegnamenti di variabili sulla riga di
 3207 comando, cos@`{@dotless{i}}:
 3208 
 3209 @example
 3210 @kbd{$ awk -v sq="'" 'BEGIN @{ print "Questo @`e un apice singolo <" sq ">" @}'}
 3211 @print{} Questo @`e un apice singolo <'>
 3212 @end example
 3213 
 3214 (Qui, le due stringhe costanti e il valore di @code{sq} sono concatenati in
 3215 un'unica stringa che @`e stampata da @code{print}.)
 3216 
 3217 Se servono veramente sia gli apici singoli che quelli doppi nel proprio
 3218 programma @command{awk}, @`e probabilmente meglio tenerlo in un file separato,
 3219 dove la shell non interferisce, e si potr@`a scrivere quello che si vuole.
 3220 
 3221 @node Doppi apici in DOS
 3222 @subsubsection Doppi apici in file .BAT Windows
 3223 
 3224 @ignore
 3225 Date: Wed, 21 May 2008 09:58:43 +0200 (CEST)
 3226 From: jeroen.brink@inter.NL.net
 3227 Subject: (g)awk "contribution"
 3228 To: arnold@skeeve.com
 3229 Message-id: <42220.193.172.132.34.1211356723.squirrel@webmail.internl.net>
 3230 
 3231 Hello Arnold,
 3232 
 3233 maybe you can help me out. Found your email on the GNU/awk online manual
 3234 pages.
 3235 
 3236 I've searched hard to figure out how, on Windows, to print double quotes.
 3237 Couldn't find it in the Quotes area, nor on google or elsewhere. Finally i
 3238 figured out how to do this myself.
 3239 
 3240 How to print all lines in a file surrounded by double quotes (on Windows):
 3241 
 3242 gawk "{ print \"\042\" $0 \"\042\" }" <file>
 3243 
 3244 Maybe this is a helpfull tip for other (Windows) gawk users. However, i
 3245 don't have a clue as to where to "publish" this tip! Do you?
 3246 
 3247 Kind regards,
 3248 
 3249 Jeroen Brink
 3250 @end ignore
 3251 
 3252 Sebbene questo @value{DOCUMENT} in generale si preoccupi solo di sistemi POSIX
 3253 e della shell POSIX, il problema che stiamo per vedere emerge abbastanza
 3254 spesso presso parecchi utenti, e per questo ne parliamo.
 3255 
 3256 @cindex Brink, Jeroen
 3257 Le ``shell'' nei sistemi Microsoft Windows usano il carattere doppio apice
 3258 per protezione, e rendono difficile o impossibile inserire un carattere
 3259 doppio apice letterale in uno @dfn{script} scritto su una riga di comando.
 3260 L'esempio che segue, per il quale ringraziamo Jeroen Brink, mostra come
 3261 proteggere i doppi apici, con questo script di una sola riga, che stampa
 3262 tutte le righe di un file, racchiudendole tra doppi apici:
 3263 
 3264 @example
 3265 @{ print "\"" $0 "\"" @} @var{file}
 3266 @end example
 3267 
 3268 @noindent
 3269 In una riga di comando in ambiente MS-Windows lo @dfn{script} di una riga
 3270 mostrato sopra pu@`o essere eseguito immettendo:
 3271 
 3272 @example
 3273 gawk "@{ print \"\042\" $0 \"\042\" @}" @var{file}
 3274 @end example
 3275 
 3276 In questo esempio, lo @samp{\042} @`e il codice ottale che rappresenta un
 3277 doppio apice; @command{gawk} lo trasforma in un carattere doppio apice
 3278 per poi scriverlo in output con l'istruzione @code{print}.
 3279 
 3280 In ambiente MS-Windows proteggere i doppi apici richiede questo
 3281 espediente perch@'e occorre usare delle barre inverse per proteggere
 3282 i doppi apici, ma le barre inverse non sono protette nella solita maniera;
 3283 in effetti le barre inverse vanno raddoppiate o no a seconda che
 3284 siano o non siano seguite da un doppio apice.
 3285 La regola in ambiente MS-Windows per racchiudere tra doppi apici una
 3286 stringa @`e la seguente:
 3287 
 3288 @enumerate
 3289 @item
 3290 Per ogni doppio apice presente nella stringa originale, sia @var{N} il
 3291 numero di barre inverse presenti nella stringa prima di esso (@var{N}
 3292 potrebbe anche valere zero).  Si rimpiazzino queste @var{N} barre inverse
 3293 con @math{2@value{VOLTE}@var{N}+1} barre inverse
 3294 
 3295 @item
 3296 Sia poi @var{N} il numero di barre inverse alla fine della stringa originale,
 3297 (@var{N} potrebbe anche valere zero). Si rimpiazzino queste @var{N}
 3298 barre inverse con @math{2@value{VOLTE}@var{N}} barre inverse
 3299 
 3300 @item
 3301 La stringa cos@`{@dotless{i}} prodotta va racchiusa fra doppi apici.
 3302 @end enumerate
 3303 
 3304 Quindi, per racchiudere fra doppi apici lo @dfn{script} di
 3305 una riga @samp{@{ print "\"" $0 "\"" @}} del precedente esempio, si
 3306 dovrebbe fare cos@`{@dotless{i}}:
 3307 
 3308 @example
 3309 gawk "@{ print \"\\\"\" $0 \"\\\"\" @}" @var{file}
 3310 @end example
 3311 
 3312 @noindent
 3313 Comunque, usare la notazione @samp{\042} invece che @samp{\\\"} rimane sempre
 3314 possibile, ed @'e di pi@`u facile lettura, perch@'e le barre inverse che non sono
 3315 seguite da un doppio apice non hanno bisogno di essere duplicate.
 3316 
 3317 @node File dati di esempio
 3318 @section @value{DDF} per gli esempi
 3319 
 3320 @cindex input @subentry esempi
 3321 @cindex file @subentry @file{mail-list}
 3322 Molti degli esempi in questo @value{DOCUMENT} hanno come input due @value{DF}
 3323 di esempio.  Il primo, @file{mail-list}, contiene una lista di nomi di
 3324 persone, insieme ai loro indirizzi email e a informazioni riguardanti le
 3325 persone stesse.
 3326 Il secondo @value{DF}, di nome @file{inventory-shipped}, contiene
 3327 informazioni riguardo a consegne mensili.  In entrambi i file,
 3328 ogni riga @`e considerata come un @dfn{record}.
 3329 
 3330 Nel @file{mail-list}, ogni record contiene il nome di una persona,
 3331 il suo numero di telefono, il suo indirizzo email, e un codice che indica
 3332 la sua relazione con l'autore della lista.
 3333 Le colonne sono allineate usando degli spazi.
 3334 Una @samp{A} nell'ultima colonna indica che quella persona @`e un conoscente
 3335 [Acquaintance].  Una @samp{F} nell'ultima colonna significa che quella
 3336 persona @`e un amico [Friend].  Una @samp{R} vuol dire che quella persona @`e
 3337 un parente [Relative]:
 3338 
 3339 @example
 3340 @c system if test ! -d eg      ; then mkdir eg      ; fi
 3341 @c system if test ! -d eg/lib  ; then mkdir eg/lib  ; fi
 3342 @c system if test ! -d eg/data ; then mkdir eg/data ; fi
 3343 @c system if test ! -d eg/prog ; then mkdir eg/prog ; fi
 3344 @c system if test ! -d eg/misc ; then mkdir eg/misc ; fi
 3345 @c file eg/data/mail-list
 3346 Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
 3347 Anthony      555-3412     anthony.asserturo@@hotmail.com   A
 3348 Becky        555-7685     becky.algebrarum@@gmail.com      A
 3349 Bill         555-1675     bill.drowning@@hotmail.com       A
 3350 Broderick    555-0542     broderick.aliquotiens@@yahoo.com R
 3351 Camilla      555-2912     camilla.infusarum@@skynet.be     R
 3352 Fabius       555-1234     fabius.undevicesimus@@ucb.edu    F
 3353 Julie        555-6699     julie.perscrutabor@@skeeve.com   F
 3354 Martin       555-6480     martin.codicibus@@hotmail.com    A
 3355 Samuel       555-3430     samuel.lanceolis@@shu.edu        A
 3356 Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
 3357 @c endfile
 3358 @end example
 3359 
 3360 @cindex file @subentry @file{inventory-shipped}
 3361 Il @value{DF} @file{inventory-shipped} contiene
 3362 informazioni sulle consegne effettuate durante l'anno.
 3363 Ogni record contiene il mese, il numero di contenitori verdi spediti,
 3364 il numero di scatole rosse spedite, il numero di borse arancione spedite,
 3365 e il numero di pacchetti blu spediti, in quest'ordine.
 3366 Ci sono 16 record, relativi ai dodici mesi dello scorso anno e ai primi
 3367 quattro mesi dell'anno in corso.
 3368 Una riga vuota separa i data relativi a ciascun anno:
 3369 
 3370 @example
 3371 @c file eg/data/inventory-shipped
 3372 Jan  13  25  15 115
 3373 Feb  15  32  24 226
 3374 Mar  15  24  34 228
 3375 Apr  31  52  63 420
 3376 May  16  34  29 208
 3377 Jun  31  42  75 492
 3378 Jul  24  34  67 436
 3379 Aug  15  34  47 316
 3380 Sep  13  55  37 277
 3381 Oct  29  54  68 525
 3382 Nov  20  87  82 577
 3383 Dec  17  35  61 401
 3384 
 3385 Jan  21  36  64 620
 3386 Feb  26  58  80 652
 3387 Mar  24  75  70 495
 3388 Apr  21  70  74 514
 3389 @c endfile
 3390 @end example
 3391 
 3392 Questi file di esempio sono inclusi nella distribuzione @command{gawk},
 3393 nella directory @file{awklib/eg/data}.
 3394 
 3395 @node Molto semplice
 3396 @section Alcuni esempi molto semplici
 3397 
 3398 I seguenti comandi eseguono un semplice programma @command{awk} che cerca
 3399 nel file in input @file{mail-list} la stringa di caratteri @samp{li} (una
 3400 sequenza di caratteri @`e solitamente chiamato una @dfn{stringa};
 3401 il termine @dfn{stringa} @`e basato su un uso linguistico, del tipo
 3402 ``una stringa di perle'' o ``una stringa di luci decorative''):
 3403 
 3404 @example
 3405 awk '/li/ @{ print $0 @}' mail-list
 3406 @end example
 3407 
 3408 @noindent
 3409 Quando si incontra una riga che contiene @samp{li}, la si stampa, perch@'e
 3410 @w{@samp{print $0}} significa "stampa la riga corrente".  (Lo scrivere solo
 3411 @samp{print} ha lo stesso significato, quindi avremmo anche potuto
 3412 limitarci a fare cos@`{@dotless{i}}).
 3413 
 3414 Si sar@`a notato che delle barre (@samp{/}) delimitano la stringa @samp{li}
 3415 nel programma @command{awk}.  Le barre indicano che @samp{li} @`e il
 3416 modello da ricercare.  Questo tipo di notazione @`e definita come
 3417 @dfn{espressione regolare}, e sar@`a trattata pi@`u avanti in maggior dettaglio
 3418 @iftex
 3419 (@pxrefil{Espressioni regolari}).
 3420 @end iftex
 3421 @ifnottex
 3422 (@pxref{Espressioni regolari}).
 3423 @end ifnottex
 3424 Il modello pu@`o corrispondere anche solo a una parte di una parola.
 3425 Ci sono
 3426 apici singoli che racchiudono il programma @command{awk} in modo che la
 3427 shell non interpreti alcuna parte di esso come un carattere speciale della
 3428 shell.
 3429 
 3430 Questo @`e quello che il programma stampa:
 3431 
 3432 @example
 3433 $ @kbd{awk '/li/ @{ print $0 @}' mail-list}
 3434 @print{} Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
 3435 @print{} Broderick    555-0542     broderick.aliquotiens@@yahoo.com R
 3436 @print{} Julie        555-6699     julie.perscrutabor@@skeeve.com   F
 3437 @print{} Samuel       555-3430     samuel.lanceolis@@shu.edu        A
 3438 @end example
 3439 
 3440 @cindex azioni @subentry default
 3441 @cindex criteri di ricerca @subentry default
 3442 In una regola @command{awk}, il criterio di selezione o l'azione possono
 3443 essere omessi, ma non entrambi.  Se il criterio @`e omesso, l'azione viene
 3444 applicata a @emph{ogni} riga dell'input.
 3445 Se l'azione viene omessa, per default si stampano tutte le righe che
 3446 sono individuate dal criterio di selezione.
 3447 
 3448 @cindex azioni @subentry omesse
 3449 Quindi, si potrebbe omettere l'azione (l'istruzione @code{print} e le
 3450 graffe) nell'esempio precedente e il risultato sarebbe lo stesso:
 3451 @command{awk} stampa tutte le righe che corrispondono al criterio di
 3452 ricerca @samp{li}.  Per confronto, omettendo l'istruzione @code{print} ma
 3453 lasciando le graffe si richiede un'azione nulla, che non fa nulla (cio@`e non
 3454 stampa alcuna riga).
 3455 
 3456 @cindex programmi @command{awk} @subentry esempi molto corti
 3457 Molti programmi @command{awk} pratici sono lunghi solo una o due righe.
 3458 Qui sotto troviamo una collezione di programmi utili e corti, per iniziare.
 3459 Alcuni di questi programmi contengono elementi del linguaggio che non sono
 3460 ancora stati spiegati.  (La descrizione del programma fornisce una buona
 3461 idea di quel che si vuole ottenere, ma occorre leggere il resto del
 3462 @value{DOCUMENT} per divenire esperti in @command{awk}!)
 3463 Molti degli esempi usano un @value{DF} di nome @file{data}.  Questo serve solo
 3464 a indicare la posizione del nome; se questi programmi devono venir usati per
 3465 se stessi, sostituire i propri @value{FNS} al posto di @file{data}.
 3466 Per futura memoria, si noti che spesso c'@`e pi@`u di un modo per fare qualcosa
 3467 in @command{awk}.  In un altro momento, si potrebbe tornare a guardare questi
 3468 esempi per vedere se si riescono a trovare modi differenti per fare le stesse
 3469 cose mostrate qui appresso:
 3470 
 3471 @itemize @value{BULLET}
 3472 @item
 3473 Stampare ogni riga lunga pi@`u di 80 caratteri:
 3474 
 3475 @example
 3476 awk 'length($0) > 80' data
 3477 @end example
 3478 
 3479 L'unica regola presente ha un'espressione di relazione come modello
 3480 e non ha azione --- quindi applica l'azione di default, stampando il record.
 3481 
 3482 @item
 3483 Stampare la lunghezza della riga in input pi@`u lunga:
 3484 
 3485 @example
 3486 @group
 3487 awk '@{ if (length($0) > max) max = length($0) @}
 3488      END @{ print max @}' data
 3489 @end group
 3490 @end example
 3491 
 3492 Il codice associato a @code{END} viene eseguito dopo che tutto
 3493 l'input @`e stato letto; @`e l'altra faccia della medaglia di @code{BEGIN}.
 3494 
 3495 @cindex programma @subentry @command{expand}
 3496 @cindex @command{expand} (programma)
 3497 @item
 3498 Stampare la lunghezza della riga pi@`u lunga in @file{data}:
 3499 
 3500 @example
 3501 expand data | awk '@{ if (x < length($0)) x = length($0) @}
 3502                    END @{ print "la lunghezza massima di una riga @`e" x @}'
 3503 @end example
 3504 
 3505 Questo esempio @`e leggermente diverso da quello precedente:
 3506 l'input @`e l'output del comando @command{expand}, che cambia i TAB
 3507 in spazi, in modo che le larghezze confrontate siano quelle che sarebbero
 3508 qualora le si stampasse, e non il numero dei caratteri di input su ogni
 3509 riga.  [il carattere TAB occupa un byte nel file, ma pu@`o generare fino a
 3510 otto spazi bianchi in fase di stampa.]
 3511 
 3512 @item
 3513 Stampare ogni riga che abbia almeno un campo:
 3514 
 3515 @example
 3516 awk 'NF > 0' data
 3517 @end example
 3518 
 3519 Questa @`e una maniera facile per eliminare le righe vuote dal file (o
 3520 piuttosto, per creare un nuovo file, simile al vecchio, ma nel quale le
 3521 linee vuote sono state tolte).
 3522 
 3523 @item
 3524 Stampare sette numeri casuali compresi tra 0 e 100, inclusi:
 3525 
 3526 @example
 3527 awk 'BEGIN @{ for (i = 1; i <= 7; i++)
 3528                  print int(101 * rand()) @}'
 3529 @end example
 3530 
 3531 @item
 3532 Stampare il numero totale di byte usato da un @var{elenco-file}:
 3533 
 3534 @example
 3535 ls -l @var{elenco-file} | awk '@{ x += $5 @}
 3536                          END @{ print "byte totali: " x @}'
 3537 @end example
 3538 
 3539 @item
 3540 Stampare il numero totale di kilobyte usati da @var{elenco-file}:
 3541 
 3542 @c Don't use \ continuation, not discussed yet
 3543 @c Remember that awk does floating point division,
 3544 @c no need for (x+1023) / 1024
 3545 @example
 3546 ls -l @var{elenco-file} | awk '@{ x += $5 @}
 3547    END @{ print "K-byte totali:", x / 1024 @}'
 3548 @end example
 3549 
 3550 @item
 3551 Stampare una lista in ordine alfabetico di tutti gli utenti del sistema
 3552 [Unix]:
 3553 
 3554 @example
 3555 awk -F: '@{ print $1 @}' /etc/passwd | sort
 3556 @end example
 3557 
 3558 @item
 3559 Contare le righe in un file:
 3560 
 3561 @example
 3562 awk 'END @{ print NR @}' data
 3563 @end example
 3564 
 3565 @item
 3566 Stampare le righe pari nel @value{DF}:
 3567 
 3568 @example
 3569 awk 'NR % 2 == 0' data
 3570 @end example
 3571 
 3572 Se aveste usato invece l'espressione @samp{NR % 2 == 1},
 3573 il programma avrebbe stampato le righe dispari.
 3574 @end itemize
 3575 
 3576 @node Due regole
 3577 @section Un esempio che usa due regole
 3578 @cindex programmi @command{awk}
 3579 
 3580 Il programma @command{awk} legge il file in input una riga alla volta.
 3581 Per ogni riga @command{awk} controlla la corrispondenza con ogni regola.
 3582 Se viene trovata pi@`u di una corrispondenza, vengono eseguite altrettante
 3583 azioni, nell'ordine in cui appaiono nel programma @command{awk}.
 3584 Se non viene trovata nessuna corrispondenza, non viene eseguita alcuna azione.
 3585 
 3586 Dopo aver elaborato tutte le regole che hanno corrispondenza con la riga (e
 3587 pu@'o darsi che nessuna corrisponda), @command{awk} legge la riga successiva.  Comunque
 3588 @pxref{Istruzione next},
 3589 @ifdocbook
 3590 e @ref{Istruzione Nextfile}.)
 3591 @end ifdocbook
 3592 @ifnotdocbook
 3593 e anche @pxref{Istruzione nextfile}.)
 3594 @end ifnotdocbook
 3595 Si prosegue cos@`{@dotless{i}} finch@'e il programma raggiunge la fine del file.
 3596 Per esempio, il seguente programma @command{awk} contiene due regole:
 3597 
 3598 @example
 3599 /12/  @{ print $0 @}
 3600 /21/  @{ print $0 @}
 3601 @end example
 3602 
 3603 @noindent
 3604 La prima regola ha la stringa @samp{12} da cercare e
 3605 @samp{print $0} come
 3606 azione.  La seconda regola ha la
 3607 stringa @samp{21} da cercare e ha ancora @samp{print $0} come azione.
 3608 L'azione di ciascuna regola @`e racchiusa in una coppia di parentesi graffe.
 3609 
 3610 Questo programma stampa ogni riga che contiene la stringa
 3611 @samp{12} @emph{oppure} la stringa @samp{21}.  Se una riga contiene entrambe
 3612 le stringhe, @`e stampata due volte, una volta per ogni regola.
 3613 
 3614 Questo @`e ci@`o che capita se eseguiamo questo programma sui nostri @value{DF},
 3615 @file{mail-list} e @file{inventory-shipped}:
 3616 
 3617 @example
 3618 $ @kbd{awk '/12/ @{ print $0 @}}
 3619 >      @kbd{/21/ @{ print $0 @}' mail-list inventory-shipped}
 3620 @print{} Anthony      555-3412     anthony.asserturo@@hotmail.com   A
 3621 @print{} Camilla      555-2912     camilla.infusarum@@skynet.be     R
 3622 @print{} Fabius       555-1234     fabius.undevicesimus@@ucb.edu    F
 3623 @print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
 3624 @print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
 3625 @print{} Jan  21  36  64 620
 3626 @print{} Apr  21  70  74 514
 3627 @end example
 3628 
 3629 @noindent
 3630 Si noti che la riga che inizia con @samp{Jean-Paul}
 3631 nel file @file{mail-list}
 3632 @`e stata stampata due volte, una volta per ogni regola.
 3633 
 3634 @node Maggiore sofisticazione
 3635 @section Un esempio pi@`u complesso
 3636 
 3637 Dopo aver imparato a eseguire alcuni semplici compiti, vediamo cosa possono
 3638 fare i tipici programmi @command{awk}.
 3639 Questo esempio mostra come @command{awk} pu@`o essere usato per riassumere,
 3640 selezionare e riordinare l'output di un altro comando.  Sono usate
 3641 funzionalit@`a di cui non si @`e ancora parlato, quindi non ci si deve preoccupare
 3642 se alcuni dettagli risulteranno oscuri:
 3643 
 3644 @example
 3645 ls -l | awk '$6 == "Nov" @{ somma += $5 @}
 3646              END @{ print somma @}'
 3647 @end example
 3648 
 3649 @cindex comando @subentry @command{ls}
 3650 Questo comando stampa il numero totale di byte in tutti i file contenuti
 3651 nella directory corrente, la cui data di modifica @`e novembre (di qualsiasi
 3652 anno).  La parte @w{@samp{ls -l}} dell'esempio @`e un comando di sistema che
 3653 fornisce un elenco dei file in una directory, con anche la dimensione di
 3654 ogni file e la data di ultima modifica.  Il suo output @`e del tipo:
 3655 
 3656 @example
 3657 -rw-r--r--  1 arnold   user   1933 Nov  7 13:05 Makefile
 3658 -rw-r--r--  1 arnold   user  10809 Nov  7 13:03 awk.h
 3659 -rw-r--r--  1 arnold   user    983 Apr 13 12:14 awk.tab.h
 3660 -rw-r--r--  1 arnold   user  31869 Jun 15 12:20 awkgram.y
 3661 -rw-r--r--  1 arnold   user  22414 Nov  7 13:03 awk1.c
 3662 -rw-r--r--  1 arnold   user  37455 Nov  7 13:03 awk2.c
 3663 -rw-r--r--  1 arnold   user  27511 Dec  9 13:07 awk3.c
 3664 -rw-r--r--  1 arnold   user   7989 Nov  7 13:03 awk4.c
 3665 @end example
 3666 
 3667 @noindent
 3668 @cindex continuazione di riga @subentry nella C shell
 3669 Il primo campo contiene le autorizzazioni di lettura/scrittura [r/w], il
 3670 secondo il numero dei collegamenti al file [cio@`e il numero di nomi con cui
 3671 il file @`e conosciuto], e il terzo campo identifica il proprietario del file.
 3672 Il quarto campo identifica il gruppo a cui appartiene il file.
 3673 Il quinto campo contiene la dimensione del file, in byte.
 3674 Il sesto, settimo e ottavo campo contengono il mese, il giorno e l'ora,
 3675 rispettivamente, in cui il file @`e stato modificato.  Infine, il nono campo
 3676 contiene il @value{FN}.
 3677 
 3678 @c @cindex automatic initialization
 3679 @cindex inizializzazione @subentry automatica
 3680 L'espressione @samp{$6 == "Nov"} nel nostro programma @command{awk} controlla
 3681 se il sesto campo dell'output di @w{@samp{ls -l}} corrisponda alla stringa
 3682 @samp{Nov}.  Ogni volta che una riga ha la stringa
 3683 @samp{Nov} come suo sesto campo, @command{awk} esegue l'azione
 3684 @samp{somma += $5}.  Questo aggiunge il quinto campo (la dimensione del file)
 3685 alla variabile @code{somma}.  Come risultato, quando @command{awk} ha finito
 3686 di leggere tutte le righe in input, @code{somma} contiene la somma totale
 3687 delle dimensioni dei file che corrispondono al criterio di ricerca.
 3688 (Ci@`o funziona contando sul fatto che le variabili @command{awk} sono
 3689 automaticamente inizializzate a zero.)
 3690 
 3691 Dopo che l'ultima riga dell'output di @command{ls} @`e stata elaborata, la
 3692 regola @code{END} viene eseguita e viene stampato il valore di @code{somma}.
 3693 In questo esempio, il valore di @code{somma} @`e 80600.
 3694 
 3695 Queste tecniche pi@`u avanzate di @command{awk} sono trattate in
 3696 @value{SECTIONS}
 3697 successive (@pxref{Panoramica sulle azioni}).  Prima di poter passare a una
 3698 programmazione pi@`u avanzata con @command{awk}, @`e necessario sapere come
 3699 @command{awk} interpreta i file in input e visualizza quelli in output.
 3700 Modificando campi e usando l'istruzione @code{print} @`e possibile produrre
 3701 dei rapporti molto utili ed esteticamente gradevoli.
 3702 
 3703 @node Istruzioni/Righe
 3704 @section Istruzioni e righe in @command{awk}
 3705 @cindex interruzioni di riga
 3706 @cindex ritorno a capo
 3707 
 3708 Molto spesso, ogni riga di un programma @command{awk} @`e un'istruzione a s@'e
 3709 stante o una regola isolata, come:
 3710 
 3711 @example
 3712 awk '/12/  @{ print $0 @}
 3713      /21/  @{ print $0 @}' mail-list inventory-shipped
 3714 @end example
 3715 
 3716 @cindex @command{gawk} @subentry ritorno a capo
 3717 Comunque, @command{gawk} ignora i ritorni a capo dopo ognuno di questi
 3718 simboli e istruzioni:
 3719 
 3720 @example
 3721 ,    @{    ?    :    ||    &&    do    else
 3722 @end example
 3723 
 3724 @noindent
 3725 Un ritorno a capo in ogni altro punto del programma @`e considerato come la
 3726 fine di un'istruzione.@footnote{Il @samp{?} e i @samp{:} elencati sopra sono
 3727 usati nell'espressione condizionale in tre parti descritta in
 3728 @ref{Espressioni condizionali}.
 3729 Il cambio di riga dopo @samp{?} e i @samp{:} @`e un'estensione minore in
 3730 @command{gawk}; specificando @option{--posix} come opzione
 3731 (@pxref{Opzioni}), quest'estensione non @`e valida.}
 3732 
 3733 @cindex @code{\} (barra inversa) @subentry continuazione di riga e
 3734 @cindex barra inversa (@code{\}) @subentry continuazione di riga e
 3735 Volendo dividere una sola istruzione su due righe in un punto in cui
 3736 andando a capo sarebbe considerata conclusa, @`e possibile @dfn{continuare}
 3737 nella riga successiva terminando la prima riga con un carattere di
 3738 barra inversa (@samp{\}).  La barra inversa dev'essere l'ultimo carattere
 3739 sulla riga, per essere riconosciuto come un carattere di continuazione.
 3740 Una barra inversa seguita da un ritorno a capo  @`e consentita
 3741 in ogni parte dell'istruzione, anche in mezzo
 3742 a una stringa o a un'espressione regolare.  Per esempio:
 3743 
 3744 @example
 3745 awk '/Questa espressione regolare @`e troppo lunga, quindi\
 3746  la continuiamo sulla riga seguente/ @{ print $1 @}'
 3747 @end example
 3748 
 3749 @noindent
 3750 @cindex portabilit@`a @subentry continuazione di riga con barra inversa e
 3751 Non abbiamo quasi mai usato la continuazione tramite barra inversa nei nostri
 3752 programmi di esempio.  @command{gawk} non pone limiti alla lunghezza di
 3753 una riga, quindi la continuazione tramite barra inversa non @`e mai strettamente
 3754 necessaria; serve soltanto a migliorare la leggibilit@`a del programma.
 3755 Per la stessa ragione, ma anche per amore di chiarezza, abbiamo tenuto
 3756 concise molte istruzioni nei programmi presentati in questo @value{DOCUMENT}.
 3757 
 3758 La continuazione tramite barra inversa @`e molto utile quando il proprio
 3759 programma @command{awk} si trova in un file sorgente separato, invece di
 3760 essere immesso nella riga di comando.  Si noti anche che molte implementazioni
 3761 di @command{awk} presentano delle differenze su dove @`e possibile usare
 3762 la continuazione tramite barra inversa.  Per esempio, potrebbero non
 3763 consentire di spezzare una costante di tipo stringa usando la continuazione
 3764 tramite barra inversa.  Quindi, per ottenere la massima portabilit@`a dei
 3765 propri programmi @command{awk}, @`e meglio non spezzare le righe nel
 3766 mezzo di un'espressione regolare o di una stringa.
 3767 @c 10/2000: gawk, mawk, and current bell labs awk allow it,
 3768 @c solaris 2.7 nawk does not. Solaris /usr/xpg4/bin/awk does though!  sigh.
 3769 
 3770 @cindex comando @subentry @command{csh}
 3771 @cindex barra inversa (@code{\}) @subentry continuazione di riga e @subentry in @command{csh}
 3772 @cindex @code{\} (barra inversa) @subentry continuazione di riga e @subentry in @command{csh}
 3773 @quotation ATTENZIONE
 3774 @emph{la continuazione tramite barra inversa non funziona come sopra descritto
 3775 nella C shell.}  Funziona per programmi @command{awk} contenuti in file e
 3776 per programmi sulla riga di comando, @emph{ammesso} che si stia usando una
 3777 shell conforme a POSIX, come la Unix Bourne shell o Bash.  Ma la C shell si
 3778 comporta in maniera diversa!  In quel caso, occorre usare due barre inverse
 3779 consecutive, in fondo alla riga.  Si noti anche che quando si usa la C shell
 3780 @emph{ogni} andata a capo nel vostro programma @command{awk} deve essere
 3781 indicata con una barra inversa. Per esempio:
 3782 
 3783 @example
 3784 % @kbd{awk 'BEGIN @{ \}
 3785 ? @kbd{  print \\}
 3786 ? @kbd{      "ciao, mondo" \}
 3787 ? @kbd{@}'}
 3788 @print{} ciao, mondo
 3789 @end example
 3790 
 3791 @noindent
 3792 Qui, il @samp{%} e il @samp{?} sono i prompt primario e secondario della
 3793 C shell, analogamente a quelli usati nella shell standard @samp{$} e @samp{>}.
 3794 
 3795 Si confronti l'esempio precedente, come viene scritto in una shell conforme
 3796 a POSIX:
 3797 
 3798 @example
 3799 $ @kbd{awk 'BEGIN @{}
 3800 >   @kbd{print \}
 3801 >       @kbd{"ciao, mondo"}
 3802 > @kbd{@}'}
 3803 @print{} ciao, mondo
 3804 @end example
 3805 @end quotation
 3806 
 3807 @command{awk} @`e un linguaggio orientato alla riga.  L'azione relativa a ogni
 3808 regola deve iniziare sulla stessa riga del criterio di selezione.  Per avere
 3809 criterio di selezione e azione su righe separate, si
 3810 @emph{deve} usare la continuazione tramite barra inversa; non si pu@`o fare
 3811 diversamente.
 3812 
 3813 @cindex barra inversa (@code{\}) @subentry continuazione di riga e @subentry commenti
 3814 @cindex @code{\} (barra inversa) @subentry continuazione di riga e @subentry commenti
 3815 @cindex commenti @subentry continuazione di riga con barra inversa e
 3816 Un'altra cosa da tener presente @`e che la continuazione tramite barra inversa e
 3817 i commenti non possono essere frammisti.  Non appena @command{awk} incontra
 3818 un @samp{#} che inizia un commento, ignora @emph{tutto} il resto della riga.
 3819 Per esempio:
 3820 
 3821 @example
 3822 @group
 3823 $ @kbd{gawk 'BEGIN @{ print "Non allarmarti" # una amichevole \}
 3824 > @kbd{               regola BEGIN}
 3825 > @kbd{@}'}
 3826 @error{} gawk: riga com.:2:              regola BEGIN
 3827 @error{} gawk: riga com.:2:                     ^ syntax error
 3828 @end group
 3829 @end example
 3830 
 3831 @noindent
 3832 In questo caso, parrebbe che la barra inversa continui il commento sulla riga
 3833 successiva.  Invece, la combinazione barra inversa-ritorno a capo non viene
 3834 per nulla notata, in quanto ``nascosta'' all'interno del commento.  Quindi,
 3835 il @code{BEGIN} @`e marcato come errore di sintassi.
 3836 
 3837 @cindex istruzioni @subentry multiple
 3838 @cindex @code{;} (punto e virgola) @subentry separare istruzioni nelle azioni
 3839 @cindex punto e virgola (@code{;}) @subentry separare istruzioni nelle azioni
 3840 @cindex @code{;} (punto e virgola) @subentry separare regole
 3841 @cindex punto e virgola (@code{;}) @subentry separare regole
 3842 Quando le istruzioni @command{awk} all'interno di una regola sono brevi, si
 3843 potrebbe metterne pi@`u d'una su una riga sola.  Ci@`o @`e possibile separando le
 3844 istruzioni con un punto e virgola (@samp{;}).
 3845 Questo vale anche per le regole stesse.
 3846 Quindi, il programma visto all'inizio di
 3847 @ifnotinfo
 3848 questa
 3849 @end ifnotinfo
 3850 @ifinfo
 3851 questo
 3852 @end ifinfo
 3853 @value{SECTION}
 3854 poteva essere scritto anche cos@`{@dotless{i}}:
 3855 
 3856 @example
 3857 /12/ @{ print $0 @} ; /21/ @{ print $0 @}
 3858 @end example
 3859 
 3860 @quotation NOTA BENE
 3861 La possibilit@`a che pi@`u regole coesistano sulla stessa riga, se sono separate
 3862 da un punto e virgola, non esisteva nel linguaggio @command{awk} originale;
 3863 @`e stata aggiunta per congruenza con quanto @`e consentito per le istruzioni
 3864 all'interno di un'azione.
 3865 @end quotation
 3866 
 3867 @node Altre funzionalit@`a
 3868 @section Altre funzionalit@`a di @command{awk}
 3869 
 3870 @cindex variabili
 3871 Il linguaggio @command{awk} mette a disposizione un numero di variabili
 3872 @dfn{built-in}, o @dfn{predefinite}, che il programma dell'utente pu@`o usare
 3873 per ottenere informazioni da @command{awk}.  Ci sono pure altre variabili
 3874 che il programma pu@`o impostare, per definire come @command{awk} deve
 3875 gestire i dati.
 3876 
 3877 Inoltre, @command{awk} mette a disposizione parecchie funzioni predefinite
 3878 [@dfn{built-in}] per effettuare calcoli di tipo comune e operazioni che
 3879 agiscono sulle stringhe di caratteri.
 3880 @command{gawk} mette a disposizione funzioni predefinite per gestire le
 3881 marcature temporali, per effettuare manipolazioni a livello di bit, per
 3882 tradurre stringhe al momento dell'esecuzione del programma
 3883 (internazionalizzazione), per determinare qual @`e il tipo di una variabile,
 3884 e per ordinare dei vettori.
 3885 
 3886 Nel seguito della presentazione del linguaggio @command{awk}, saranno
 3887 introdotte molte delle variabili e parecchie funzioni.  Esse sono
 3888 descritte sistematicamente in @ref{Variabili predefinite} e in
 3889 @ref{Funzioni}.
 3890 
 3891 @node Quando
 3892 @section Quando usare @command{gawk}
 3893 
 3894 @cindex @command{awk} @subentry uso di
 3895 Ora che abbiamo visto qualcosa di quel che @command{awk} @`e in grado di fare,
 3896 ci si potr@`a chiedere come @command{awk} potrebbe tornare utile.  Usando
 3897 programmi di utilit@`a, criteri di ricerca sofisticati, separatori
 3898 di campo, istruzioni aritmetiche, e altri criteri di selezione, @`e possibile
 3899 produrre degli output molto pi@`u complessi.  Il linguaggio @command{awk} @`e
 3900 molto utile per fornire dei tabulati partendo da grandi quantit@`a di dati
 3901 grezzi, per esempio riassumendo informazioni dall'output di altri
 3902 programmi di utilit@`a come @command{ls}.
 3903 (@xref{Maggiore sofisticazione}.)
 3904 
 3905 I programmi scritti con @command{awk} sono normalmente molto pi@`u
 3906 corti dei loro equivalenti in altri linguaggi.  Ci@`o rende i programmi
 3907 @command{awk} facili da comporre e da utilizzare.  Spesso i programmi
 3908 @command{awk} possono essere scritti al volo a terminale, usati una volta sola
 3909 e buttati via.  Poich@'e i programmi @command{awk} sono interpretati, si pu@`o
 3910 evitare la (normalmente laboriosa) parte di compilazione nel ciclo tipico
 3911 dello sviluppo software, ossia edita-compila-prova-correggi.
 3912 
 3913 @cindex Brian Kernighan @subentry @command{awk} di
 3914 In @command{awk} sono stati scritti programmi complessi, compreso un assembler
 3915 completo, pluri-piattaforma per
 3916 @ifclear FOR_PRINT
 3917 @iftex
 3918 microprocessori a 8-bit (@pxrefil{Glossario}, per maggiori informazioni),
 3919 @end iftex
 3920 @ifnottex
 3921 microprocessori a 8-bit (@pxref{Glossario}, per maggiori informazioni),
 3922 @end ifnottex
 3923 @end ifclear
 3924 @ifset FOR_PRINT
 3925 microprocessori a 8-bit,
 3926 @end ifset
 3927 e un assembler di microcodice per un computer dedicato esclusivamente
 3928 al linguaggio Prolog.
 3929 Le possibilit@`a dell'originale @command{awk} erano messe a dura prova
 3930 da programmi di questa complessit@`a, ma le versioni moderne sono pi@`u robuste.
 3931 
 3932 @cindex programmi @command{awk} @subentry complessi
 3933 Se capita di scrivere programmi @command{awk} pi@`u lunghi di, diciamo,
 3934 qualche centinaio di righe, si potrebbe considerare la possibilit@`a di usare
 3935 un linguaggio di programmazione differente da @command{awk}.
 3936 La shell consente di ricercare stringhe ed espressioni regolari; inoltre
 3937 consente di usare in maniera efficace i comandi di utilit@`a del sistema.
 3938 Python offre un piacevole equilibrio tra la facilit@`a di una programmazione
 3939 ad alto livello, e la possibilit@`a di interagire a livello di sistema
 3940 operativo.@footnote{Altri linguaggi di @dfn{script} popolari comprendono Ruby
 3941 e Perl.}
 3942 
 3943 @node Sommario dell'introduzione
 3944 @section Sommario
 3945 
 3946 @c FIXME: Review this chapter for summary of builtin functions called.
 3947 @itemize @value{BULLET}
 3948 @item
 3949 I programmi in @command{awk} consistono di coppie di
 3950 @var{criterio di ricerca}--@var{azione}.
 3951 
 3952 @item
 3953 Un'@var{azione} senza una @var{condizione di ricerca} viene sempre eseguita.
 3954 L'@var{azione} di default per una condizione mancante @`e @samp{@{ print $0 @}}.
 3955 
 3956 @item
 3957 Usare
 3958 @samp{awk '@var{programma}' @var{file}}
 3959 oppure
 3960 @samp{awk -f @var{file-programma} @var{file}}
 3961 per eseguire @command{awk}.
 3962 
 3963 @item
 3964 Si pu@`o usare la notazione speciale @samp{#!} nella prima riga per creare
 3965 programmi @command{awk} che siano eseguibili direttamente.
 3966 
 3967 @item
 3968 I commenti nei programmi @command{awk} iniziano con @samp{#} e continuano
 3969 fino alla fine della stessa riga.
 3970 
 3971 @item
 3972 Prestare attenzione ai problemi con gli apici nei programmi @command{awk}
 3973 che facciano parte di uno @dfn{script} della shell (o di un file .BAT di
 3974 MS-Windows).
 3975 
 3976 @item
 3977 Si pu@`o usare la continuazione tramite barra inversa per continuare righe di
 3978 codice sorgente.  Le righe sono continuate automaticamente dopo i simboli
 3979 virgola, parentesi aperta, punto interrogativo, punto e virgola,
 3980 @samp{||}, @samp{&&}, @code{do} ed  @code{else}.
 3981 @end itemize
 3982 @node Invocare Gawk
 3983 @chapter Eseguire @command{awk} e @command{gawk}
 3984 
 3985 Questo @value{CHAPTER} tratta di come eseguire @command{awk}, delle opzioni da
 3986 riga di comando, sia quelle dello standard POSIX che quelle specifiche di
 3987 @command{gawk}, e di cosa fanno @command{awk} e @command{gawk} con gli
 3988 argomenti che non sono opzioni.
 3989 Prosegue poi spiegando come @command{gawk} cerca i file sorgenti,
 3990 leggendo lo standard input assieme ad altri file, le variabili d'ambiente di
 3991 @command{gawk}, il codice di ritorno di @command{gawk}, l'uso dei file
 3992 inclusi, e opzioni e/o funzionalit@`a obsolete e non documentate.
 3993 
 3994 Molte delle opzioni e funzionalit@`a qui descritte sono trattate con
 3995 maggior dettaglio nei capitoli successivi del @value{DOCUMENT}; gli argomenti
 3996 presenti in questo @value{CHAPTER} che al momento non interessano si possono
 3997 tranquillamente saltare.
 3998 
 3999 @menu
 4000 * Riga di comando::             Come eseguire @command{awk}.
 4001 * Opzioni::                     Opzioni sulla riga di comando e loro
 4002                                 significato.
 4003 * Altri argomenti::             Nomi dei file in input e assegnamento di
 4004                                 valori a variabili.
 4005 * Specificare lo standard input:: Come specificare lo standard input insieme ad
 4006                                 altri file.
 4007 * Variabili d'ambiente::        Le variabili d'ambiente usate da
 4008                                 @command{gawk}.
 4009 * Codice di ritorno::           Il codice di ritorno all'uscita da
 4010                                 @command{gawk}.
 4011 * Includere file::              Come includere altri file nel proprio
 4012                                 programma.
 4013 * Caricare librerie condivise:: Caricare librerie condivise nel
 4014                                 proprio programma.
 4015 * Parti obsolete::              Opzioni e/o funzionalit@`a obsolete.
 4016 * Non documentato::             Opzioni e funzionalit@`a non documentate.
 4017 * Sommario invocazione::        Sommario invocazione.
 4018 @end menu
 4019 
 4020 @node Riga di comando
 4021 @section Come eseguire @command{awk}
 4022 @cindex riga di comando @subentry eseguire @command{awk} da
 4023 @cindex @command{awk} @subentry eseguire
 4024 @cindex argomenti @subentry riga di comando @subentry eseguire @command{awk}
 4025 @cindex opzioni @subentry sulla riga di comando @subentry per eseguire @command{awk}
 4026 
 4027 Ci sono due modi di eseguire @command{awk}: con un programma esplicito o con
 4028 uno o pi@`u file di programma.  Qui @`e mostrata la sintassi di entrambi; le voci
 4029 racchiuse tra [@dots{}] sono opzionali:
 4030 
 4031 @display
 4032 @command{awk} [@var{opzioni}] @option{-f} @var{file_di _programma} [@option{--}] @var{file} @dots{}
 4033 @command{awk} [@var{opzioni}] [@option{--}] @code{'@var{programma}'} @var{file} @dots{}
 4034 @end display
 4035 
 4036 @cindex GNU @subentry opzioni estese sulla riga di comando
 4037 @cindex estese @subentry opzioni
 4038 @cindex opzioni @subentry estese GNU
 4039 In aggiunta alle tradizionali opzioni di una sola lettera in stile POSIX,
 4040 @command{gawk} consente anche le opzioni estese GNU.
 4041 
 4042 @cindex angolo buio @subentry invocare @command{awk}
 4043 @cindex @dfn{lint} @subentry controlli @subentry con programma vuoto
 4044 @cindex controllo @subentry @dfn{lint} @subentry con programma vuoto
 4045 @`E possibile invocare @command{awk} con un programma vuoto:
 4046 
 4047 @example
 4048 awk '' file_dati_1 file_dati_2
 4049 @end example
 4050 
 4051 @cindex @option{--lint} (opzione)
 4052 @cindex opzione @subentry @option{--lint}
 4053 @cindex angolo buio @subentry programmi vuoti
 4054 @noindent
 4055 Fare cos@`{@dotless{i}} ha comunque poco senso; @command{awk} termina
 4056 silenziosamente quando viene fornito un programma vuoto.
 4057 @value{DARKCORNER}
 4058 Se @`e stato specificato @option{--lint} sulla riga di comando,
 4059 @command{gawk} emette un avviso che avverte
 4060 che il programma @`e vuoto.
 4061 
 4062 @node Opzioni
 4063 @section Opzioni sulla riga di comando
 4064 @cindex opzioni @subentry sulla riga di comando
 4065 @cindex riga di comando @subentry opzioni
 4066 @cindex GNU @subentry opzioni estese sulla riga di comando
 4067 @cindex opzioni @subentry estese GNU
 4068 
 4069 Le opzioni sono precedute da un trattino e consistono in un unico carattere.
 4070 Le opzioni estese in stile GNU sono precedute da un doppio trattino e
 4071 consistono in una parola
 4072 chiave.  La parola chiave pu@`o essere abbreviata, a condizione che
 4073 l'abbreviazione identifichi univocamente l'opzione.  Se l'opzione prevede un
 4074 argomento, la parola chiave @`e immediatamente seguita da un segno di uguale
 4075 (@samp{=}) e dal valore dell'argomento, oppure la parola chiave e il valore
 4076 dell'argomento sono separati da spazio bianco (spazi o caratteri TAB).
 4077 Se un'opzione con un valore viene immessa pi@`u di una volta,
 4078 l'ultimo valore @`e quello che conta.
 4079 
 4080 @cindex POSIX @command{awk} @subentry opzioni estese GNU
 4081 Ogni opzione estesa di @command{gawk} ha una corrispondente opzione
 4082 breve in stile POSIX.
 4083 Le opzioni estese e brevi sono
 4084 intercambiabili in tutti i contesti.
 4085 L'elenco seguente descrive le opzioni richieste dallo standard POSIX:
 4086 
 4087 @table @code
 4088 @item -F @var{fs}
 4089 @itemx --field-separator @var{fs}
 4090 @cindex @option{-F} (opzione)
 4091 @cindex opzione @subentry @option{-F}
 4092 @cindex @option{--field-separator} (opzione)
 4093 @cindex opzione @subentry @option{--field-separator}
 4094 @cindex @code{FS} (variabile) @subentry l'opzione @code{--field-separator} e
 4095 Imposta la variabile @code{FS} a @var{fs}
 4096 (@pxref{Separatori di campo}).
 4097 
 4098 @item -f @var{file-sorgente}
 4099 @itemx --file @var{file-sorgente}
 4100 @cindex @option{-f} (opzione)
 4101 @cindex opzione @subentry @option{-f}
 4102 @cindex @option{--file} (opzione)
 4103 @cindex opzione @subentry @option{--file}
 4104 @cindex programmi @command{awk} @subentry collocazione dei
 4105 Legge il sorgente del programma @command{awk} da @var{file-sorgente}
 4106 anzich@'e prenderlo dal primo argomento che non @`e un'opzione.
 4107 Quest'opzione pu@`o essere data pi@`u volte; il programma @command{awk}
 4108 @`e formato dalla concatenazione del contenuto di ogni
 4109 @var{file-sorgente} specificato.
 4110 
 4111 I file specificati dall'opzione @option{-f} sono considerati
 4112 appartenere allo spazio-dei-nomi @samp{"awk" (@@namespace "awk")}
 4113 a inizio programma. @xref{Cambiare lo spazio-dei-nomi}, per ulteriori
 4114 informazioni riguardo a questa funzionalit@`a avanzata.
 4115 
 4116 @item -v @var{var}=@var{val}
 4117 @itemx --assign @var{var}=@var{val}
 4118 @cindex @option{-v} (opzione)
 4119 @cindex opzione @subentry @option{-v}
 4120 @cindex @option{--assign} (opzione)
 4121 @cindex opzione @subentry @option{--assign}
 4122 @cindex variabili @subentry impostazione
 4123 Imposta la variabile @var{var} al valore @var{val} @emph{prima} che inizi
 4124 l'esecuzione del programma.  Tali valori di variabile sono disponibili
 4125 all'interno della regola @code{BEGIN}
 4126 (@pxref{Altri argomenti}).
 4127 
 4128 L'opzione @option{-v} pu@`o impostare una sola variabile per volta, ma pu@`o
 4129 essere usata pi@`u di una volta, impostando ogni volta una variabile
 4130 differente, in questo modo:
 4131 @samp{awk @w{-v pippo=1} @w{-v pluto=2} @dots{}}.
 4132 
 4133 @cindex predefinita @subentry variabile @subentry impostare con opzione @code{-v}
 4134 @cindex variabili @subentry predefinite @subentry impostare con opzione @code{-v}
 4135 @quotation ATTENZIONE
 4136 Usare @option{-v} per impostare valori di variabili predefinite
 4137 pu@`o condurre a risultati sorprendenti.  @command{awk} reimposter@`a i
 4138 valori di quelle variabili secondo le sue necessit@`a, anche ignorando
 4139 eventuali valori iniziali che possono essere stati assegnati.
 4140 @end quotation
 4141 
 4142 @item -W @var{gawk-opt}
 4143 @cindex @option{-W} (opzione)
 4144 @cindex opzione @subentry @option{-W}
 4145 Fornisce un'opzione specifica dell'implementazione.  Questa @`e la convenzione
 4146 POSIX per fornire opzioni specifiche dell'implementazione.
 4147 Queste opzioni
 4148 hanno anche una corrispondente opzione estesa scritta in stile GNU.
 4149 Si noti che le opzioni estese possono essere abbreviate, sempre che
 4150 le abbreviazioni siano univoche.
 4151 L'elenco completo delle opzioni specifiche di @command{gawk} @`e riportato di
 4152 seguito.
 4153 
 4154 @item --
 4155 @cindex riga di comando @subentry opzioni @subentry fine delle
 4156 @cindex opzioni @subentry sulla riga di comando @subentry fine delle
 4157 Segnale della fine delle opzioni da riga di comando.  I seguenti argomenti
 4158 non sono trattati come opzioni anche se iniziano con @samp{-}.  Questa
 4159 interpretazione di @option{--} segue le convenzioni POSIX per l'analisi degli
 4160 argomenti.
 4161 
 4162 @cindex @code{-} (meno) @subentry nomi di file che iniziano con
 4163 @cindex meno (@code{-}) @subentry nomi di file che iniziano con
 4164 @`E utile se si hanno @value{FNS} che iniziano con @samp{-},
 4165 o negli @dfn{script} di shell, se si hanno @value{FNS} che devono essere
 4166 specificati dall'utente che potrebbero iniziare con @samp{-}.
 4167 @`E utile anche per passare opzioni al programma @command{awk};
 4168 si veda @ref{Funzione getopt}.
 4169 @end table
 4170 
 4171 L'elenco che segue descrive le opzioni specifiche di @command{gawk}:
 4172 
 4173 @c Have to use @asis here to get docbook to come out right.
 4174 @table @asis
 4175 @item @option{-b}
 4176 @itemx @option{--characters-as-bytes}
 4177 @cindex @option{-b} (opzione)
 4178 @cindex opzione @subentry @option{-b}
 4179 @cindex @option{--characters-as-bytes} (opzione)
 4180 @cindex opzione @subentry @option{--characters-as-bytes}
 4181 Fa s@`{@dotless{i}} che @command{gawk} tratti tutti i dati in input come caratteri di un solo
 4182 byte.  In aggiunta, tutto l'output scritto con @code{print} o @code{printf}
 4183 viene trattato come composto da caratteri contenuti in un solo byte.
 4184 
 4185 Normalmente, @command{gawk} segue lo standard POSIX e cerca di elaborare i suoi
 4186 dati di input in accordo con la localizzazione corrente
 4187 (@pxref{Localizzazioni}).
 4188 Questo spesso pu@`o comportare la conversione di caratteri multibyte in
 4189 caratteri estesi (internamente), e pu@`o
 4190 creare problemi o confusione se i dati di input non contengono caratteri
 4191 multibyte validi. Quest'opzione @`e una maniera facile di dire a @command{gawk}:
 4192 ``Gi@`u le mani dai miei dati!''.
 4193 
 4194 @item @option{-c}
 4195 @itemx @option{--traditional}
 4196 @cindex @option{-c} (opzione)
 4197 @cindex opzione @subentry @option{-c}
 4198 @cindex @option{--traditional} (opzione)
 4199 @cindex opzione @subentry @option{--tradizional}
 4200 @cindex modalit@`a compatibile di (@command{gawk}) @subentry specificare
 4201 Specifica la @dfn{modalit@`a di compatibilit@`a}, nella quale le estensioni GNU al
 4202 linguaggio @command{awk} sono disabilitate; in questo modo @command{gawk} si
 4203 comporta proprio come la versione di BWK @command{awk}.
 4204 
 4205 @xref{POSIX/GNU},
 4206 che riassume le estensioni.
 4207 @ifclear FOR_PRINT
 4208 Si veda anche
 4209 @ref{Modalit@`a di compatibilit@`a}.
 4210 @end ifclear
 4211 
 4212 @item @option{-C}
 4213 @itemx @option{--copyright}
 4214 @cindex @option{-C} (opzione)
 4215 @cindex opzione @subentry @option{-C}
 4216 @cindex @option{--copyright} (opzione)
 4217 @cindex opzione @subentry @option{--copyright}
 4218 @cindex GPL (General Public License) @subentry stampare
 4219 Stampa la versione ridotta della General Public License ed esce.
 4220 
 4221 @item @option{-d}[@var{file}]
 4222 @itemx @option{--dump-variables}[@code{=}@var{file}]
 4223 @cindex @option{-d} (opzione)
 4224 @cindex opzione @subentry @option{-d}
 4225 @cindex @option{--dump-variables} (opzione)
 4226 @cindex opzione @subentry @option{--dump-variables}
 4227 @cindex fornire una lista di tutte le variabili del programma
 4228 @cindex @file{awkvars.out} @subentry file
 4229 @cindex file @subentry @file{awkvars.out}
 4230 @cindex variabili @subentry globali @subentry stampare una lista delle
 4231 Stampa una lista ordinata di variabili globali, i loro tipi, e i valori finali
 4232 in @var{file}.  Se non viene fornito alcun @var{file}, stampa questa lista
 4233 in un file chiamato @file{awkvars.out} nella directory corrente.
 4234 Non sono consentiti spazi tra @option{-d} e @var{file}, se
 4235 @var{file} viene specificato.
 4236 
 4237 @cindex risoluzione di problemi @subentry refusi @subentry variabili globali
 4238 @cindex problemi @subentry risoluzione di @subentry refusi, variabili globali
 4239 Avere una lista di tutte le variabili globali @`e un buon modo per cercare
 4240 refusi nei propri programmi.
 4241 Si pu@`o usare quest'opzione anche se si ha un grosso programma con tantissime
 4242 funzioni, e si vuol essere sicuri che le funzioni non usino
 4243 inavvertitamente variabili globali che sarebbero dovute essere locali
 4244 (questo @`e un errore particolarmente facile da fare con nomi di variabile
 4245 semplici come @code{i}, @code{j}, etc.).
 4246 
 4247 @item @option{-D}[@var{file}]
 4248 @itemx @option{--debug}[@code{=}@var{file}]
 4249 @cindex @option{-D} (opzione)
 4250 @cindex opzione @subentry @option{-D}
 4251 @cindex @option{--debug} (opzione)
 4252 @cindex opzione @subentry @option{--debug}
 4253 @cindex @command{awk} @subentry debug, abilitare
 4254 Abilita l'esecuzione del debug di programmi @command{awk}
 4255 (@pxref{Debugging}).
 4256 Per default, il debugger legge i comandi interattivamente dalla tastiera
 4257 (standard input).
 4258 L'argomento opzionale @var{file} consente di specificare un file con una lista
 4259 di comandi per il debugger da eseguire in maniera non interattiva.
 4260 Non sono consentiti spazi tra @option{-D} e @var{file}, se
 4261 @var{file} viene indicato.
 4262 
 4263 @item @option{-e} @var{testo-del-programma}
 4264 @itemx @option{--source} @var{testo-del-programma}
 4265 @cindex @option{-e} (opzione)
 4266 @cindex opzione @subentry @option{-e}
 4267 @cindex @option{--source} (opzione)
 4268 @cindex opzione @subentry @option{--source}
 4269 @cindex codice sorgente @subentry combinare
 4270 Fornisce del codice sorgente nel @var{testo-del-programma}.
 4271 Quest'opzione consente di combinare il codice sorgente contenuto in file
 4272 col codice sorgente immesso sulla riga di comando.
 4273 Questo @`e particolarmente utile quando si hanno funzioni di libreria che si
 4274 vogliono usare dai programmi da riga di comando
 4275 (@pxref{AWKPATH (Variabile)}).
 4276 
 4277 Si noti che @command{gawk} elabora ogni stringa come se fosse terminata
 4278 da un carattere di ritorno a capo (anche se non @`e questo il caso).
 4279 Ci@`o facilita la costruzione del programma completo.
 4280 
 4281 @quotation ATTENZIONE
 4282 Prima della @value{PVERSION} 5.0, non era necessario
 4283 che ogni @var{testo-di-programma} costituisse
 4284 un'unit@`a sintattica completa.  P.es., il codice che segue
 4285 funzionava:
 4286 
 4287 @example
 4288 $ @kbd{gawk -e 'BEGIN @{ a = 5 ;' -e 'print a @}'}
 4289 @print{} 5
 4290 @end example
 4291 
 4292 @noindent
 4293 Comunque ci@`o non @`e pi@`u possibile.  Se c'@`e qualche @dfn{script}
 4294 che utilizza tale possibilit@`a, @`e necessario modificarlo.
 4295 
 4296 Il motivo di ci@`o @`e che ogni @var{testo-di-programma} @`e considerato
 4297 appartenere allo spazio di nomi @samp{"awk" (@@namespace "awk")}
 4298 a inizio programma. @xref{Cambiare lo spazio-dei-nomi}, per ulteriori
 4299 informazioni.
 4300 @end quotation
 4301 
 4302 @item @option{-E} @var{file}
 4303 @itemx @option{--exec} @var{file}
 4304 @cindex @option{-E} (opzione)
 4305 @cindex opzione @subentry @option{-E}
 4306 @cindex @option{--exec} (opzione)
 4307 @cindex opzione @subentry @option{--exec}
 4308 @cindex programmi @command{awk} @subentry collocazione dei
 4309 @cindex CGI, @command{awk} @dfn{script} per
 4310 Simile a @option{-f}, legge il testo del programma @command{awk} da
 4311 @var{file}.  Ci sono due differenze rispetto a @option{-f}:
 4312 
 4313 @itemize @value{BULLET}
 4314 @item
 4315 Quest'opzione fa terminare l'elaborazione delle opzioni; qualsiasi
 4316 altra cosa sulla riga di comando viene inoltrata direttamente al programma
 4317 @command{awk}.
 4318 
 4319 @item
 4320 Le variabili da riga di comando della forma
 4321 @samp{@var{var}=@var{value}} non sono ammesse.
 4322 @end itemize
 4323 
 4324 Quest'opzione @`e particolarmente necessaria per le applicazioni World Wide Web
 4325 CGI che passano argomenti attraverso le URL; l'uso di quest'opzione impedisce
 4326 a un utente malintenzionato (o ad altri) di passare opzioni, assegnamenti o
 4327 codice sorgente @command{awk} (con @option{-e}) all'applicazione
 4328 CGI.@footnote{Per maggiori dettagli,
 4329 si veda la Sezione 4.4 di @uref{http://www.ietf.org/rfc/rfc3875,
 4330 RFC 3875}. Si veda anche
 4331 @uref{https://lists.gnu.org/archive/html/bug-gawk/2014-11/msg00022.html,
 4332 note esplicative spedite alla mailing list @command{gawk} bug}.}
 4333 Quest'opzione dovrebbe essere usata
 4334 con @dfn{script} @samp{#!}
 4335 (@pxref{@dfn{Script} eseguibili}), in questo modo:
 4336 
 4337 @example
 4338 #! /usr/local/bin/gawk -E
 4339 
 4340 @var{il programma awk @`e qui @dots{}}
 4341 @end example
 4342 
 4343 @item @option{-g}
 4344 @itemx @option{--gen-pot}
 4345 @cindex @option{-g} (opzione)
 4346 @cindex opzione @subentry @option{-g}
 4347 @cindex @option{--gen-pot} (opzione)
 4348 @cindex opzione @subentry @option{--gen-pot}
 4349 @cindex portabilit@`a @subentry generare file oggetto
 4350 @cindex file @subentry oggetto portabili @subentry generare
 4351 Analizza il programma sorgente e
 4352 genera un file GNU @command{gettext} @dfn{portable object template} sullo
 4353 standard output per tutte le costanti di tipo stringa che sono state marcate
 4354 come da tradurre.
 4355 @xref{Internazionalizzazione},
 4356 per informazioni su quest'opzione.
 4357 
 4358 @item @option{-h}
 4359 @itemx @option{--help}
 4360 @cindex @option{-h} (opzione)
 4361 @cindex opzione @subentry @option{-h}
 4362 @cindex @option{--help} (opzione)
 4363 @cindex opzione @subentry @option{--help}
 4364 @cindex GNU @subentry opzioni estese sulla riga di comando @subentry stampare una lista di
 4365 @cindex opzioni @subentry stampare una lista di
 4366 @cindex stampa @subentry lista di opzioni
 4367 Stampa un messaggio sull'``uso'' riassumendo le opzioni brevi ed estese
 4368 accettate da @command{gawk} ed esce.
 4369 
 4370 @item @option{-i} @var{file-sorgente}
 4371 @itemx @option{--include} @var{file-sorgente}
 4372 @cindex @option{-i} (opzione)
 4373 @cindex opzione @subentry @option{-i}
 4374 @cindex @option{--include} (opzione)
 4375 @cindex opzione @subentry @option{--include}
 4376 @cindex programmi @command{awk} @subentry collocazione dei
 4377 Legge una libreria di sorgenti @command{awk} da @var{file-sorgente}.
 4378 Quest'opzione @`e del tutto equivalente a usare la direttiva @code{@@include}
 4379 all'interno del proprio programma.  @`E molto simile all'opzione
 4380 @option{-f}, ma ci sono due differenze importanti.  Primo, quando viene usata
 4381 l'opzione @option{-i}, il sorgente del programma non viene caricato se @`e
 4382 stato caricato in precedenza, mentre con @option{-f}, @command{gawk} carica
 4383 sempre il file.  Secondo, poich@'e quest'opzione @`e pensata per essere usata
 4384 con librerie di codice, @command{gawk} non riconosce tali file come
 4385 costituenti l'input del programma principale.  Cos@`{@dotless{i}}, dopo l'elaborazione di
 4386 un argomento @option{-i}, @command{gawk} si aspetta di trovare il codice
 4387 sorgente principale attraverso l'opzione @option{-f} o sulla riga di comando.
 4388 
 4389 I file specificati dall'opzione @option{-i} sono considerati
 4390 appartenere allo spazio-dei-nomi @samp{"awk" (@@namespace "awk")}
 4391 a inizio programma. @xref{Cambiare lo spazio-dei-nomi}, per ulteriori
 4392 informazioni.
 4393 
 4394 @item @option{-l} @var{ext}
 4395 @itemx @option{--load} @var{ext}
 4396 @cindex @option{-l} (opzione)
 4397 @cindex opzione @subentry @option{-l}
 4398 @cindex @option{--load} (opzione)
 4399 @cindex opzione @subentry @option{--load}
 4400 @cindex caricare estensioni
 4401 @cindex estensioni @subentry caricare
 4402 Carica un'estensione dinamica denominata @var{ext}.  Le estensioni sono
 4403 memorizzate come librerie condivise di sistema.
 4404 Quest'opzione ricerca la libreria usando la variabile d'ambiente
 4405 @env{AWKLIBPATH}.  Il suffisso corretto per la piattaforma in uso verr@`a
 4406 fornito per default, perci@`o non @`e necessario specificarlo nel nome
 4407 dell'estensione.  La routine di inizializzazione dell'estensione dovrebbe
 4408 essere denominata @code{dl_load()}.  Un'alternativa @`e quella di usare la
 4409 direttiva @code{@@load} all'interno del programma per caricare una libreria
 4410 condivisa.  Questa funzionalit@`a avanzata @`e descritta in dettaglio in
 4411 @ref{Estensioni dinamiche}.
 4412 
 4413 @item @option{-L}[@var{valore}]
 4414 @itemx @option{--lint}[@code{=}@var{valore}]
 4415 @cindex @option{-L} (opzione)
 4416 @cindex opzione @subentry @option{-L}
 4417 @cindex @option{--lint} (opzione)
 4418 @cindex opzione @subentry @option{--lint}
 4419 @cindex @dfn{lint} @subentry controlli @subentry emissione di avvertimenti
 4420 @cindex avvertimenti @subentry emissione di
 4421 Emette messaggi d'avvertimento relativi a costrutti dubbi o non portabili ad
 4422 altre implementazioni di @command{awk}.
 4423 Non sono consentiti spazi tra @option{-L} e @var{valore}, se
 4424 viene indicato il @var{valore}.
 4425 Alcuni avvertimenti vengono emessi quando @command{gawk} legge preliminarmente
 4426 il programma.  Altri vengono emessi quando il programma viene eseguito.
 4427 L'argomento opzionale pu@`o essere uno dei seguenti:
 4428 
 4429 @table @code
 4430 @item fatal
 4431 Richiede che gli avvertimenti di lint siano considerati errori gravi.
 4432 Potrebbe essere una misura drastica, per@`o il
 4433 suo uso incoragger@`a certamente lo sviluppo di programmi @command{awk} pi@`u
 4434 corretti.
 4435 
 4436 @item invalid
 4437 Vengono emessi solo gli
 4438 avvertimenti relativi a quello che @`e effettivamente non valido (funzionalit@`a
 4439 non ancora completamente implementata).
 4440 
 4441 @item no-ext
 4442 Gli avvertimenti relativi alle estensioni @command{gawk} sono disabilitati.
 4443 @end table
 4444 
 4445 Alcuni avvertimenti vengono stampati solo una volta, anche se i costrutti dubbi
 4446 per i quali vengono emessi avvisi ricorrono diverse volte nel programma
 4447 @command{awk}.  Perci@`o, nell'eliminazione dei problemi rilevati da
 4448 @option{--lint}, bisogna porre attenzione a cercare tutte le occorrenze di ogni
 4449 costrutto inappropriato.  Siccome i programmi @command{awk} generalmente sono
 4450 brevi, questa non @`e un'operazione gravosa.
 4451 
 4452 @item @option{-M}
 4453 @itemx @option{--bignum}
 4454 @cindex @option{-M} (opzione)
 4455 @cindex opzione @subentry @option{-M}
 4456 @cindex @option{--bignum} (opzione)
 4457 @cindex opzione @subentry @option{--bignum}
 4458 Chiede il calcolo con precisione arbitraria sui numeri.  Quest'opzione non ha
 4459 alcun effetto se @command{gawk} non @`e compilato per l'uso delle librerie GNU
 4460 MPFR e MP
 4461 (@pxref{Calcolo con precisione arbitraria}).
 4462 
 4463 @item @option{-n}
 4464 @itemx @option{--non-decimal-data}
 4465 @cindex @option{-n} (opzione)
 4466 @cindex opzione @subentry @option{-n}
 4467 @cindex @option{--non-decimal-data} (opzione)
 4468 @cindex opzione @subentry @option{--non-decimal-data}
 4469 @cindex esadecimali @subentry numeri @subentry abilitare l'interpretazione di
 4470 @cindex valori @subentry esadecimali @subentry abilitare l'interpretazione di
 4471 @cindex ottali @subentry numeri @subentry abilitare l'interpretazione di
 4472 @cindex valori @subentry ottali @subentry abilitare l'interpretazione di
 4473 @cindex risoluzione di problemi @subentry opzione @code{--non-decimal-data}
 4474 Abilita l'interpretazione automatica di valori ottali ed esadecimali
 4475 nei dati di input
 4476 (@pxref{Dati non decimali}).
 4477 
 4478 @quotation ATTENZIONE
 4479 Quest'opzione pu@`o generare gravi malfunzionamenti nei vecchi programmi.
 4480 Usare con cautela.  Si noti anche che
 4481 quest'opzione potrebbe non essere pi@`u disponibile in una futura versione di
 4482 @command{gawk}.
 4483 @end quotation
 4484 
 4485 @item @option{-N}
 4486 @itemx @option{--use-lc-numeric}
 4487 @cindex @option{-N} (opzione)
 4488 @cindex opzione @subentry @option{-N}
 4489 @cindex @option{--use-lc-numeric} (opzione)
 4490 @cindex opzione @subentry @option{--use-lc-numeric}
 4491 Forza l'uso del carattere di separazione decimale della localizzazione
 4492 quando analizza i dati in input
 4493 (@pxref{Localizzazioni}).
 4494 
 4495 @cindex stampa elegante
 4496 @item @option{-o}[@var{file}]
 4497 @itemx @option{--pretty-print}[@code{=}@var{file}]
 4498 @cindex @option{-o} (opzione)
 4499 @cindex opzione @subentry @option{-o}
 4500 @cindex @option{--pretty-print} (opzione)
 4501 @cindex opzione @subentry @option{--pretty-print}
 4502 Consente la stampa di una versione formattata elegantemente dei programmi
 4503 @command{awk}.  Implica l'opzione @option{--no-optimize}.
 4504 Per default il programma di output viene creato in un file
 4505 chiamato @file{awkprof.out} (@pxref{Profilare}).
 4506 L'argomento opzionale @var{file} consente di specificare un
 4507 @value{FN} differente per l'output.
 4508 Non sono consentiti spazi tra @option{-o} e @var{file}, se
 4509 @var{file} viene indicato.
 4510 
 4511 @quotation NOTA
 4512 Nel passato, quest'opzione eseguiva anche il programma.
 4513 Ora non @`e pi@`u cos@`{@dotless{i}}.
 4514 @end quotation
 4515 
 4516 @item @option{-O}
 4517 @itemx @option{--optimize}
 4518 @cindex @option{-O} (opzione)
 4519 @cindex opzione @subentry @option{-O}
 4520 @cindex @option{--optimize} (opzione)
 4521 @cindex opzione @subentry @option{--optimize}
 4522 Abilita le ottimizzazioni di default nella rappresentazione interna del
 4523 programma.  Attualmente, questo comprende solo delle semplificazioni nell'uso
 4524 di costanti.
 4525 
 4526 Quest'ottimizzazione @`e abilitata per default.
 4527 Quest'opzione rimane disponibile per compatibilit@`a all'indietro.
 4528 Tuttavia pu@`o essere usata per annullare l'effetto di una precedente
 4529 opzione @option{-s} (si veda pi@`u sotto in questa lista).
 4530 
 4531 @item @option{-p}[@var{file}]
 4532 @itemx @option{--profile}[@code{=}@var{file}]
 4533 @cindex @option{-p} (opzione)
 4534 @cindex opzione @subentry @option{-p}
 4535 @cindex @option{--profile} (opzione)
 4536 @cindex opzione @subentry @option{--profile}
 4537 @cindex @command{awk} @subentry profilazione, abilitare la
 4538 Abilita la creazione del profilo di esecuzione di programmi @command{awk}
 4539 (@pxref{Profilare}).
 4540 Implicitamente viene forzata l'opzione @option{--no-optimize}.
 4541 Per default, i profili vengono creati in un file chiamato @file{awkprof.out}.
 4542 L'argomento opzionale @var{file} consente di specificare un altro
 4543 @value{FN} per il file del profilo.
 4544 Non sono consentiti spazi tra @option{-p} e @var{file}, se
 4545 viene indicato un @var{file}.
 4546 
 4547 Il profilo contiene il numero di esecuzioni di ogni istruzione sul margine
 4548 sinistro e il conteggio delle chiamate di funzione per ogni funzione.
 4549 
 4550 @item @option{-P}
 4551 @itemx @option{--posix}
 4552 @cindex @option{-P} (opzione)
 4553 @cindex opzione @subentry @option{-P}
 4554 @cindex @option{--posix} (opzione)
 4555 @cindex opzione @subentry @option{--posix}
 4556 @cindex POSIX @subentry modalit@`a
 4557 @cindex modalit@`a POSIX 
 4558 @cindex @command{gawk} @subentry estensioni, disabilitare
 4559 Opera in modalit@`a POSIX rigorosa.  Disabilita tutte le estensioni di
 4560 @command{gawk} (proprio come @option{--traditional}) e
 4561 disabilita tutte le estensioni non consentite da POSIX.
 4562 
 4563 @xref{Estensioni comuni}, per un sommario delle estensioni
 4564 di @command{gawk} che sono disabilitate da quest'opzione.
 4565 Inoltre,
 4566 vengono applicate le seguenti
 4567 restrizioni:
 4568 
 4569 @itemize @value{BULLET}
 4570 
 4571 @cindex ritorno a capo
 4572 @cindex spazi vuoti @subentry ritorno a capo come
 4573 @item
 4574 I ritorni a capo non sono consentiti dopo @samp{?} o @samp{:}
 4575 (@pxref{Espressioni condizionali}).
 4576 
 4577 
 4578 @cindex @code{FS} (variabile) @subentry carattere TAB come
 4579 @cindex variabile @subentry @code{FS} @subentry carattere TAB come
 4580 @item
 4581 Specificando @samp{-Ft} sulla riga di comando non si imposta il valore
 4582 della variabile @code{FS} a un singolo carattere TAB
 4583 (@pxref{Separatori di campo}).
 4584 
 4585 @cindex localizzazione @subentry separatore decimale della
 4586 @cindex separatore decimale @subentry carattere specifico della localizzazione
 4587 @item
 4588 Il carattere di separatore decimale della localizzazione @`e usato per analizzare
 4589 i dati di input
 4590 (@pxref{Localizzazioni}).
 4591 @end itemize
 4592 
 4593 @c @cindex automatic warnings
 4594 @c @cindex warnings, automatic
 4595 @cindex @option{--traditional} (opzione) @subentry e opzione @code{--posix}
 4596 @cindex opzione @subentry @option{--traditional} @subentry e opzione @code{--posix}
 4597 @cindex @option{--posix} (opzione) @subentry e opzione @code{--traditional}
 4598 @cindex opzione @subentry @option{--posix} @subentry e opzione @code{--traditional}
 4599 Se si forniscono entrambe le opzioni @option{--traditional} e @option{--posix}
 4600 sulla riga di comando, @option{--posix} ha la precedenza.  Se vengono fornite
 4601 entrambe le opzioni @command{gawk} emette un avviso.
 4602 
 4603 @item @option{-r}
 4604 @itemx @option{--re-interval}
 4605 @cindex @option{-r} (opzione)
 4606 @cindex opzione @subentry @option{-r}
 4607 @cindex @option{--re-interval} (opzione)
 4608 @cindex opzione @subentry @option{--re-interval}
 4609 @cindex espressioni regolari @subentry espressioni di intervallo e
 4610 Consente le espressioni di intervallo
 4611 (@pxref{Operatori di espressioni regolari})
 4612 nelle espressioni regolari.
 4613 Questo @`e ora il comportamento di default di @command{gawk}.
 4614 Tuttavia, quest'opzione rimane (sia per retrocompatibilit@`a
 4615 che per l'uso in combinazione con @option{--traditional}).
 4616 
 4617 @item @option{-s}
 4618 @itemx @option{--no-optimize}
 4619 @cindex @option{-s} (opzione)
 4620 @cindex opzione @subentry @option{-s}
 4621 @cindex @option{--no-optimize} (opzione)
 4622 @cindex opzione @subentry @option{--no-optimize}
 4623 Disabilita le opzioni di ottimizzazione di default di @command{gawk}
 4624 effettuate sulla rappresentazione interna del programma.
 4625 
 4626 @item @option{-S}
 4627 @itemx @option{--sandbox}
 4628 @cindex @option{-S} (opzione)
 4629 @cindex opzione @subentry @option{-S}
 4630 @cindex @option{--sandbox} (opzione)
 4631 @cindex opzione @subentry @option{--sandbox}
 4632 @cindex @dfn{sandbox} @subentry modalit@`a
 4633 @cindex prova @subentry modalit@`a di
 4634 @cindex @code{ARGV} (vettore)
 4635 @cindex vettore @subentry @code{ARGV}
 4636 Disabilita la funzione @code{system()},
 4637 la ridirezione dell'input con @code{getline},
 4638 la ridirezione dell'output con @code{print} e @code{printf},
 4639 e le estensioni dinamiche.
 4640 Inoltre, non consente di aggiungere nomi di file ad @code{ARGV} che
 4641 non siano gi@`a presenti all'inizio dell'esecuzione di @command{gawk}.
 4642 @`E particolarmente utile quando si vogliono eseguire @dfn{script} @command{awk}
 4643 da sorgenti dubbie e si vuol essere ricuri che gli @dfn{script} non abbiano
 4644 accesso al sistema (oltre ai @value{DF} di input specificati).
 4645 
 4646 @item @option{-t}
 4647 @itemx @option{--lint-old}
 4648 @cindex @option{-t} (opzione)
 4649 @cindex opzione @subentry @option{-t}
 4650 @cindex @option{--lint-old} (opzione)
 4651 @cindex opzione @subentry @option{--lint-old}
 4652 Avvisa su costrutti che non sono disponibili nella versione originale di
 4653 @command{awk} dalla versione 7 di Unix
 4654 (@pxref{V7/SVR3.1}).
 4655 
 4656 @item @option{-V}
 4657 @itemx @option{--version}
 4658 @cindex @option{-V} (opzione)
 4659 @cindex opzione @subentry @option{-V}
 4660 @cindex @option{--version} (opzione)
 4661 @cindex opzione @subentry @option{--version}
 4662 @cindex @command{gawk} @subentry versione di @subentry stampa informazioni su
 4663 Stampa informazioni sulla versione di questa specifica copia di @command{gawk}.
 4664 Consente di determinare se la copia di @command{gawk} in uso @`e aggiornata
 4665 rispetto a quello che @`e attualmente in distribuzione da parte della Free
 4666 Software Foundation.
 4667 @`E utile anche per la segnalazione di bug
 4668 (@pxref{Bug}).
 4669 
 4670 @cindex @code{-} (meno) @subentry @code{--} marcatore della fine delle opzioni
 4671 @cindex meno (@code{-}) @subentry @code{--} marcatore della fine delle opzioni
 4672 @item @code{--}
 4673 Marca la fine di tutte le opzioni.
 4674 Ogni argomento sulla riga di comando che segue @code{--} viene messo
 4675 nel vettore @code{ARGV}, anche se inizia con il segno meno (@code{-}).
 4676 @end table
 4677 
 4678 Ogni altra opzione, se @`e stato specificato il testo di un programma
 4679 @`e contrassegnata come non valida con un messaggio di avvertimento,
 4680 altrimenti @`e ignorata.
 4681 
 4682 @cindex @option{-F} (opzione) @subentry @option{-Ft} imposta @code{FS} a TAB
 4683 @cindex opzione @subentry @option{-F} @subentry opzione @option{-Ft} imposta @code{FS} a TAB
 4684 In modalit@`a di compatibilit@`a, come caso particolare, se il valore di @var{fs}
 4685 fornito all'opzione @option{-F} @`e @samp{t}, @code{FS} @`e impostata al carattere
 4686 TAB (@code{"\t"}).  Questo @`e vero solo per @option{--traditional} e non
 4687 per @option{--posix}
 4688 (@pxref{Separatori di campo}).
 4689 
 4690 @cindex @option{-f} (opzione) @subentry usi multipli
 4691 @cindex opzione @subentry @option{-f} @subentry usi multipli
 4692 L'opzione @option{-f} pu@`o essere usata pi@`u di una volta nella riga di comando.
 4693 In questo caso, @command{awk} legge il sorgente del suo programma da tutti i
 4694 file indicati, come se fossere concatenati assieme a formare un unico grande
 4695 file.
 4696 Questo @`e utile per creare librerie di funzioni di @command{awk}.  Queste
 4697 funzioni possono venir scritte una volta e in seguito recuperate da una
 4698 posizione standard, invece di doverle includere in ogni singolo programma.
 4699 L'opzione @option{-i} @`e simile in questo senso.
 4700 (Come indicato in
 4701 @ref{Sintassi delle definizioni},
 4702 i nomi di funzione devono essere univoci).
 4703 
 4704 Con @command{awk} standard, le funzioni di libreria si possono ancora usare,
 4705 anche se il  programma @`e immesso dalla tastiera,
 4706 specificando @samp{-f /dev/tty}.  Dopo aver scritto il programma,
 4707 premere @kbd{Ctrl-d} (il carattere di fine file) per terminarlo.
 4708 (Si potrebbe anche usare @samp{-f -} per leggere il sorgente del programma
 4709 dallo standard input, ma poi non si potr@`a usare lo standard input come sorgente
 4710 di dati).
 4711 
 4712 Siccome @`e scomodo usare il meccanismo di @command{awk} standard per combinare
 4713 file sorgenti e programmi @command{awk} da riga di comando, @command{gawk}
 4714 fornisce l'opzione @option{-e}.  Questo non richiede di evitare l'uso dello
 4715 standard input per immettere codice sorgente, e consente di combinare
 4716 facilmente codice sorgente da riga di comando e da libreria
 4717 (@pxref{AWKPATH (Variabile)}).
 4718 Come per @option{-f}, le opzioni @option{-e} e @option{-i}
 4719 si possono usare pi@`u volte nella riga di comando.
 4720 
 4721 @cindex @option{-e} (opzione)
 4722 @cindex opzione @subentry @option{-e}
 4723 Se non sono specificate le opzioni @option{-f} o @option{-e},
 4724 @command{gawk} usa il primo argomento diverso da un'opzione,
 4725 presente sulla riga di comando, come testo del codice sorgente
 4726 del programma.  Gli argomenti sulla riga di comando che si trovano
 4727 dopo il testo del programma sono inseriti nel vettore @code{ARGV};
 4728 @command{awk} @emph{non} continua ad analizzare la riga di comando
 4729 alla ricerca di ulteriori opzioni.
 4730 
 4731 @cindex @env{POSIXLY_CORRECT} (variabile d'ambiente)
 4732 @cindex variabili d'ambiente @subentry @env{POSIXLY_CORRECT}
 4733 @cindex @dfn{lint} @subentry controlli @env{POSIXLY_CORRECT} (variabile d'ambiente)
 4734 @cindex controllo @subentry @dfn{lint} @subentry @env{POSIXLY_CORRECT} (variabile d'ambiente)
 4735 @cindex POSIX @subentry modalit@`a
 4736 @cindex modalit@`a POSIX 
 4737 Se la variabile d'ambiente @env{POSIXLY_CORRECT} esiste,
 4738 @command{gawk} si comporta in modalit@`a POSIX rigorosa, esattamente come se
 4739 fosse stata fornita l'opzione @option{--posix}.
 4740 Molti programi GNU cercano questa variabile d'ambiente per eliminare
 4741 estensioni che confliggono con POSIX, ma @command{gawk} si comporta in modo
 4742 diverso: sopprime tutte le estensioni, anche quelle che non confliggono con
 4743 POSIX, e funziona rigorosamente in modalit@`a POSIX.
 4744 Se viene fornita l'opzione @option{--lint} sulla riga di comando e
 4745 @command{gawk} passa alla modalit@`a POSIX a causa di @env{POSIXLY_CORRECT},
 4746 viene emesso un messaggio di avvertimento indicando che @`e attiva la
 4747 modalit@`a POSIX.  Normalmente questa variabile si imposta nel file di avvio
 4748 della shell a livello utente.
 4749 Per una shell compatibile con Bourne (come Bash), queste righe andranno
 4750 aggiunte nel file @file{.profile} della directory "home" dell'utente:
 4751 
 4752 @example
 4753 POSIXLY_CORRECT=true
 4754 export POSIXLY_CORRECT
 4755 @end example
 4756 
 4757 @cindex @command{csh} (comando di utilit@`a) @subentry variabile d'ambiente @env{POSIXLY_CORRECT}
 4758 Per una shell compatibile con C,@footnote{Non raccomandato.}
 4759 questa riga andr@`a aggiunta nel file @file{.login} nella directory "home"
 4760 dell'utente:
 4761 
 4762 @example
 4763 setenv POSIXLY_CORRECT true
 4764 @end example
 4765 
 4766 @cindex portabilit@`a @subentry variabile d'ambiente @env{POSIXLY_CORRECT}
 4767 Avere @env{POSIXLY_CORRECT} impostata non @`e raccomandato per l'uso quotidiano,
 4768 ma @`e utile per provare la portabilit@`a dei programmi su altri
 4769 ambienti.
 4770 
 4771 @node Altri argomenti
 4772 @section Altri argomenti della riga di comando
 4773 @cindex riga di comando @subentry argomenti
 4774 @cindex argomenti @subentry riga di comando
 4775 
 4776 Qualsiasi altro argomento sulla riga di comando @`e trattato normalmente come
 4777 file in input da elaborare nell'ordine con cui @`e specificato. Comunque, un
 4778 argomento che ha la forma @code{@var{var}=@var{valore}}, assegna
 4779 il valore @var{valore} alla variabile @var{var} --- non specifica affatto
 4780 un file.  (Si veda @ref{Opzioni di assegnamento}.)  Nel seguente esempio,
 4781 @var{count=1} @`e un assegnamento di variabile, non un @value{FN}:
 4782 
 4783 @example
 4784 awk -f programma.awk file1 count=1 file2
 4785 @end example
 4786 
 4787 @noindent
 4788 Incidentalmente, se davvero fosse necessario che @command{awk}
 4789 tratti un file dal nome @file{count=1} (o qualsiasi altro file il cui
 4790 nome assomigli a un assegnamento di variabile), il nome di file in
 4791 questione andr@`a fatto precedere da @samp{./}, come nell'esempio seguente:
 4792 
 4793 @example
 4794 awk -f programma.awk file1 ./count=1 file2
 4795 @end example
 4796 
 4797 @cindex @command{gawk} @subentry @code{ARGIND} (variabile) in
 4798 @cindex @code{ARGIND} (variabile) @subentry argomenti da riga di comando
 4799 @cindex @code{ARGV} (vettore) @subentry indicizzare all'interno di
 4800 @cindex @code{ARGC}/@code{ARGV} (variabili) @subentry argomenti da riga di comando
 4801 @cindex @command{gawk} @subentry @code{PROCINFO} (vettore) vettori in
 4802 @cindex @code{PROCINFO} (vettore) @subentry vettori in
 4803 Tutti gli argomenti da riga di comando sono resi disponibili al programma
 4804 @command{awk} nel vettore @code{ARGV} (@pxref{Variabili predefinite}).  Opzioni da
 4805 riga di comando e il testo del programma (se presente) sono esclusi da
 4806 @code{ARGV}.  Tutti gli altri argomenti, compresi gli assegnamenti di
 4807 variabile, sono inclusi.  Come ogni elemento di @code{ARGV} viene elaborato,
 4808 @command{gawk} imposta @code{ARGIND} all'indice in @code{ARGV}
 4809 dell'elemento corrente.  (@command{gawk} mette a disposizione l'intera
 4810 riga di comando, ed @`e contenuta in @code{PROCINFO["argv"]};
 4811 @pxref{Variabili auto-assegnate}.)
 4812 
 4813 @c FIXME: One day, move the ARGC and ARGV node closer to here.
 4814 La modifica di @code{ARGC} e @code{ARGV} nel proprio programma @command{awk}
 4815 consente di controllare come @command{awk} elabora i file in input; questo @`e
 4816 descritto pi@`u dettagliatamente in @ref{ARGC e ARGV}.
 4817 
 4818 @cindex input @subentry assegnamenti di variabile e
 4819 @cindex assegnamento @subentry di variabile e file in input
 4820 La distinzione tra argomenti che sono @value{FN} e argomenti di assegnamento
 4821 di variabili vien fatta quando @command{awk} deve aprire il successivo file di
 4822 input.
 4823 A quel punto dell'esecuzione, controlla la variabile @value{FN} per vedere se
 4824 @`e piuttosto un assegnamento di variabile; se cos@`{@dotless{i}} @`e, @command{awk} imposta la
 4825 variabile invece di leggere un file.
 4826 
 4827 Dunque, le variabili ricevono effettivamente i valori loro assegnati dopo che
 4828 tutti i file precedentemente specificati sono stati letti.  In particolare, i
 4829 valori delle variabili assegnati in questo modo @emph{non} sono disponibili
 4830 all'interno di una regola @code{BEGIN}
 4831 (@pxref{BEGIN/END}),
 4832 poich@'e tali regole vengono eseguite prima che @command{awk} cominci a
 4833 esaminare la lista degli argomenti.
 4834 
 4835 @cindex angolo buio @subentry sequenze di protezione
 4836 I valori delle variabili dati sulla riga di comando sono elaborati per
 4837 rimuovere sequenze di protezione (@pxref{Sequenze di protezione}).
 4838 @value{DARKCORNER}
 4839 
 4840 In alcune implementazioni di @command{awk} molto vecchie, quando un
 4841 assegnamento di variabile capitava prima di un qualsiasi @value{FN},
 4842 l'assegnamento avveniva @emph{prima} che fosse stata eseguita la regola
 4843 @code{BEGIN}.  Il comportamento di @command{awk} era in questo modo
 4844 ambiguo; alcuni assegnamenti da riga di comando erano disponibili
 4845 all'interno della regola @code{BEGIN}, mentre altri no.  Sfortunatamente,
 4846 alcune applicazioni finivano per essere dipendenti da questa
 4847 ``funzionalit@`a''.  Quando @command{awk} fu modificato per essere pi@`u
 4848 coerente, fu aggiunta l'opzione @option{-v} a beneficio delle
 4849 applicazioni che dipendevano dal vecchio comportamento.
 4850 
 4851 La funzionalit@`a dell'assegnamento di variabile @`e molto utile per assegnare
 4852 valori a variabili come @code{RS}, @code{OFS}, e @code{ORS}, che controllano i
 4853 formati di input e di output, prima di effettuare la scansione dei @value{DF}.
 4854 @`E utile anche per effettuare passaggi multipli su uno stesso
 4855 @value{DF}.  Per esempio:
 4856 
 4857 @cindex file @subentry passaggi multipli su
 4858 @example
 4859 awk 'pass == 1  @{ @var{istruzioni pass 1} @}
 4860 pass == 2  @{ @var{istruzioni pass 2} @}' pass=1 mydata pass=2 mydata
 4861 @end example
 4862 
 4863 Una volta disponibile la funzionalit@`a per assegnare una variabile, l'opzione
 4864 @option{-F} per impostare il valore di @code{FS} non @`e pi@`u strettamente
 4865 necessaria.  Rimane per compatibilit@`a all'indietro.
 4866 
 4867 @node Specificare lo standard input
 4868 @section Come specificare lo standard input insieme ad altri file
 4869 
 4870 Capita spesso di voler leggere lo standard input assieme ad altri file.
 4871 Per esempio, leggere un file, leggere lo standard input derivante da una
 4872 @dfn{pipe}, e poi leggere un altro file.
 4873 
 4874 Il modo di indicare lo standard input, con tutte le versioni di @command{awk},
 4875 @`e quello di usare un segno meno o trattino da solo, @samp{-}.  Per esempio:
 4876 
 4877 @example
 4878 @var{qualche_comando} | awk -f ilmioprogramma.awk file1 - file2
 4879 @end example
 4880 
 4881 @noindent
 4882 In questo caso, @command{awk} legge prima @file{file1}, poi legge
 4883 l'output di  @var{qualche_comando}, e infile legge
 4884 @file{file2}.
 4885 
 4886 Si pu@`o anche usare @code{"-"} per indicare lo standard input quando si leggono
 4887 i file con @code{getline} (@pxref{Getline file}).
 4888 E si pu@`o perfino usare @code{"-"} con l'opzione @option{-f} per
 4889 leggere il sorgente del programma dallo standard input
 4890 (@pxref{Opzioni}).
 4891 
 4892 In aggiunta, @command{gawk} consente di specificare il
 4893 @value{FN} speciale @file{/dev/stdin}, sia sulla riga di comando che
 4894 quando si usa @code{getline}.
 4895 Anche qualche altra versione di @command{awk} include questa funzionalit@`a,
 4896 ma non @`e standard.
 4897 (Alcuni sistemi operativi prevedono un file @file{/dev/stdin}
 4898 nel filesystem; comunque, @command{gawk} elabora sempre
 4899 questo @value{FN} per conto suo [ossia non importa se il sistema
 4900 operativo rende disponibile il file o no].)
 4901 
 4902 @node Variabili d'ambiente
 4903 @section Le variabili d'ambiente usate da @command{gawk}
 4904 @cindex variabili d'ambiente @subentry usate da @command{gawk}
 4905 
 4906 Diverse variabili d'ambiente influiscono sul comportamento
 4907 di @command{gawk}.
 4908 
 4909 @menu
 4910 * AWKPATH (Variabile)::         Ricerca di programmi @command{awk}
 4911                                 in una lista di directory.
 4912 * AWKLIBPATH (Variabile)::      Ricerca di librerie condivise
 4913                                 @command{awk} su varie directory.
 4914 * Altre variabili d'ambiente::  Le variabili d'ambiente.
 4915 @end menu
 4916 
 4917 @node AWKPATH (Variabile)
 4918 @subsection Ricerca di programmi @command{awk} in una lista di directory.
 4919 @cindex @env{AWKPATH} (variabile d'ambiente)
 4920 @cindex variabili d'ambiente @subentry @env{AWKPATH}
 4921 @cindex directory @subentry ricerca di file sorgente
 4922 @cindex percorso di ricerca @subentry per file sorgente
 4923 @cindex ricerca @subentry percorso di, per file sorgente
 4924 @cindex differenze tra @command{awk} e @command{gawk} @subentry @env{AWKPATH} (variabile d'ambiente)
 4925 @ifinfo
 4926 Il precedente @value{SECTION} ha descritto come i file di programma di
 4927 @command{awk} possono essere specificati sulla riga di comando con
 4928 l'opzione @option{-f}.
 4929 @end ifinfo
 4930 Nella maggior parte delle implementazioni di @command{awk} si deve indicare il
 4931 percorso completo di ogni file di programma, a meno che il file non
 4932 sia nella directory corrente.  Con @command{gawk}, invece, se la
 4933 variabile @value{FN} impostata con le opzioni @option{-f} o @option{-i} non
 4934 contiene un separatore di directory @samp{/}, @command{gawk} cerca un file con
 4935 quel nome in un elenco di directory (chiamato @dfn{percorso di ricerca}),
 4936 scorrendole una per una.
 4937 
 4938 Il percorso di ricerca @`e una stringa di nomi di directory separati da due
 4939 punti@footnote{Punti e virgola in MS-Windows.}.  @command{gawk} prende
 4940 il percorso di ricerca dalla variabile d'ambiente @env{AWKPATH}.  Se questa
 4941 variabile non esiste, o se ha un come valore la stringa nulla,
 4942 @command{gawk} usa un percorso di default (descritto tra poco).
 4943 
 4944 La funzionalit@`a del percorso di ricerca @`e particolarmente utile per costruire
 4945 librerie di funzioni di @command{awk}.  I file di libreria possono essere messi
 4946 in una directory standard inclusa nel percorso di ricerca
 4947 e richiamati sulla riga di comando con un
 4948 @value{FN} breve.  Altrimenti, si dovrebbe scrivere l'intero @value{FN} per
 4949 ciascun file.
 4950 
 4951 Usando l'opzione @option{-i}, o l'opzione @option{-f}, i programmi di
 4952 @command{awk} scritti sulla riga di comando possono usare le funzionalit@`a
 4953 contenute nei file di libreria di @command{awk}
 4954 @iftex
 4955 (@pxrefil{Funzioni di libreria}).
 4956 @end iftex
 4957 @ifnottex
 4958 (@pxref{Funzioni di libreria}).
 4959 @end ifnottex
 4960 La ricerca del percorso non viene eseguita se @command{gawk} @`e in modalit@`a di
 4961 compatibilit@`a, sia con l'opzione @option{--traditional} che con l'opzione
 4962 @option{--posix}.
 4963 @xref{Opzioni}.
 4964 
 4965 Se il file del codice sorgente non viene trovato con una prima ricerca,
 4966 il percorso viene cercato di nuovo dopo aver aggiunto il suffisso
 4967 @samp{.awk} al @value{FN}.
 4968 
 4969 Il meccanismo di ricerca del percorso di @command{gawk} @`e simile a quello
 4970 della shell.
 4971 (Si veda @uref{https://www.gnu.org/software/bash/manual/,
 4972 @cite{The Bourne-Again SHell manual}}.)
 4973 Un elemento nullo nel percorso indica la directory corrente.
 4974 (Un elemento nullo @`e indicato iniziando o terminando il percorso con un segno
 4975 di @samp{:} oppure mettendo due @samp{:} consecutivi [@samp{::}].)
 4976 
 4977 @quotation NOTA
 4978 Per includere la directory corrente nel percorso di ricerca, si pu@`o
 4979 aggiungere @file{.} come un elemento del percorso di ricerca, oppure
 4980 inserire un elemento nullo.
 4981 
 4982 Diverse passate versioni di @command{gawk} avrebbero effettuato anche una
 4983 ricerca esplicita nella directory corrente, prima o dopo aver esaminato il
 4984 percorso di ricerca.  A partire dalla @value{PVERSION} 4.1.2, questo non
 4985 vale pi@`u; se si desidera una ricerca nella directory corrente, @`e
 4986 necessario aggiungere @file{.} esplicitamente, oppure aggiungendo un
 4987 elemento nullo al percorso di ricerca.
 4988 @end quotation
 4989 
 4990 Il valore di default di @env{AWKPATH} @`e
 4991 @samp{.:/usr/local/share/awk}.@footnote{La versione di @command{gawk}
 4992 che state usando potrebbe usare una directory diversa; ci@`o dipende da come
 4993 @command{gawk} @`e stato compilato e installato.  La directory effettiva @`e il
 4994 valore di @code{$(pkgdatadir)} generato quando @`e stato configurato
 4995 @command{gawk}.
 4996 (Per ulteriori dettagli si veda il file @file{INSTALL} nella distribuzione
 4997 in formato sorgente, e anche @ref{Installazione veloce}.
 4998 Non @`e comunque il caso di preoccuparsi per questo.)}
 4999 Poich@'e @file{.} @`e incluso all'inizio, @command{gawk} cerca dapprima nella
 5000 directory corrente, e poi in @file{/usr/local/share/awk}.
 5001 In pratica, questo vuol dire che solo raramente ci sar@`a bisogno di cambiare
 5002 il valore di @env{AWKPATH}.
 5003 
 5004 @xref{File da usare a inizio sessione}, per informazioni su funzioni che possono
 5005 essere di aiuto per gestire la variabile @env{AWKPATH}.
 5006 
 5007 @command{gawk} memorizza il valore del percorso di ricerca in uso in
 5008 @code{ENVIRON["AWKPATH"]}.  Questo consente di aver accesso al valore del
 5009 percorso di ricerca in uso all'interno di un programma @command{awk}.
 5010 
 5011 Sebbene la variabile @code{ENVIRON["AWKPATH"]} possa
 5012 essere cambiata anche all'interno di
 5013 un programma @command{awk}, questo non modifica il comportamento del
 5014 programma in esecuzione.  Questo comportamento ha una sua logica: la variabile
 5015 d'ambiente @env{AWKPATH} @`e usata per trovare i file sorgenti del programma; una
 5016 volta che il programma @`e in esecuzione, tutti i file sono stati trovati,
 5017 e @command{gawk} non ha pi@`u bisogno di usare @env{AWKPATH}.
 5018 
 5019 @node AWKLIBPATH (Variabile)
 5020 @subsection Ricerca di librerie condivise @command{awk} su varie directory.
 5021 @cindex @env{AWKLIBPATH} (variabile d'ambiente)
 5022 @cindex directory @subentry ricerca di estensioni caricabili
 5023 @cindex percorso di ricerca @subentry per estensioni
 5024 @cindex differenze tra @command{awk} e @command{gawk} @subentry @code{AWKLIBPATH} (variabile d'ambiente)
 5025 
 5026 La variabile d'ambiente @env{AWKLIBPATH} @`e simile alla variabile @env{AWKPATH},
 5027 ma @`e usata per ricercare estensioni caricabili (memorizzate come
 5028 librerie condivise di sistema) specificate con l'opzione @option{-l},
 5029 anzich@'e file sorgenti.  Se l'estensione non viene trovata, il percorso viene
 5030 cercato nuovamente dopo aver aggiunto il suffisso per la libreria condivisa
 5031 appropriato per la piattaforma.  Per esempio, sui sistemi GNU/Linux viene usato
 5032 il suffisso @samp{.so}.  Il percorso di ricerca specificato @`e usato anche
 5033 attraverso la direttiva @code{@@load}
 5034 (@pxref{Caricare librerie condivise}).
 5035 
 5036 Se la variabile d'ambiente @env{AWKLIBPATH} non esiste, o se ha come valore
 5037 la stringa nulla, @command{gawk} usa un percorso di ricerca di default;
 5038 questo normalmente vale @samp{/usr/local/lib/gawk}, anche se il suo valore
 5039 pu@`o essere diverso, a seconda di come @`e stato installato
 5040 @command{gawk}.@footnote{La vostra versione di @command{gawk}
 5041 pu@`o utilizzare una directory differente; dipende da come @command{gawk}
 5042 @`e stato generato e installato.  La directory utilizzata ha il valore
 5043 che @`e stato generato per @code{$(pkgextensiondir)} nel momento in cui
 5044 @`e stata fatta la configurazione di @command{gawk}.
 5045 (Per ulteriori dettagli si veda il file @file{INSTALL} nella distribuzione
 5046 in formato sorgente e anche @ref{Installazione veloce}.
 5047 Non @`e comunque il caso di preoccuparsi per questo.)}
 5048 
 5049 @xref{File da usare a inizio sessione}, per informazioni su funzioni che possono
 5050 essere di aiuto per gestire la variabile @env{AWKPATH}.
 5051 
 5052 @command{gawk} memorizza il valore del percorso di ricerca in uso in
 5053 @code{ENVIRON["AWKLIBPATH"]}.  Questo consente di aver accesso al valore del
 5054 percorso di ricerca in uso all'interno di un programma @command{awk}.
 5055 
 5056 Sebbene sia possibile modificare la variabile @code{ENVIRON["AWKLIBPATH"]}
 5057 all'interno di un programma @command{awk}, la modifica non ha effetto
 5058 sul comportamento del programma in esecuzione.
 5059 Il motivo @`e chiaro: la variabile d'ambiente
 5060 @env{AWKLIBPATH} @`e usata per trovare eventuali estensioni richieste, e
 5061 queste sono caricate prima che il programma inizi l'esecuzione.  Dopo che
 5062 il programma ha iniziato l'esecuzione, tutte le estensioni sono gi@`a state
 5063 caricate, e @command{gawk} non ha pi@`u bisogno di usare la variabile d'ambiente
 5064 @env{AWKLIBPATH}.
 5065 
 5066 @node Altre variabili d'ambiente
 5067 @subsection Le variabili d'ambiente.
 5068 
 5069 Molte altre variabili d'ambiente influenzano il comportamento di
 5070 @command{gawk}, ma esse sono pi@`u specializzate.  Quelle dell'elenco seguente
 5071 sono quelle pi@`u utili agli utenti normali:
 5072 
 5073 @table @env
 5074 @item GAWK_MSEC_SLEEP
 5075 Specifica l'intervallo tra due tentativi di riconnessione,
 5076 in millisecondi.  Sui sistemi che non prevedono
 5077 la chiamata di sistema @code{usleep()},
 5078 il valore @`e arrotondato a un numero intero di secondi .
 5079 
 5080 @item GAWK_READ_TIMEOUT
 5081 Specifica per quanto tempo, in millisecondi, @command{gawk}
 5082 aspetta l'input prima di emettere un messaggio di errore.
 5083 
 5084 @item GAWK_SOCK_RETRIES
 5085 Controlla il numero di volte che @command{gawk} cerca di
 5086 ristabilire una connessione bidirezionale TCP/IP (@dfn{socket}) prima di
 5087 rinunciare a farlo.
 5088 @xref{Reti TCP/IP}.
 5089 Si noti che quando @`e attiva l'opzione di continuazione dopo errori di I/O
 5090 (@pxref{Continuazione dopo errori}),
 5091 @command{gawk} tenta di aprire un @dfn{socket} TCP/IP soltanto una volta.
 5092 
 5093 @item POSIXLY_CORRECT
 5094 Provoca il passaggio di @command{gawk} alla modalit@`a di compatibilit@`a POSIX,
 5095 disabilitando tutte le estensioni tradizionali e GNU.
 5096 @xref{Opzioni}.
 5097 @end table
 5098 
 5099 Le variabili d'ambiente nell'elenco che segue sono utili
 5100 soprattutto agli sviluppatori di @command{gawk} per il collaudo e la messa
 5101 a punto del programma.  Sono soggette a cambiamenti.  Le variabili sono:
 5102 
 5103 @table @env
 5104 @item AWKBUFSIZE
 5105 Questa variabile riguarda solo @command{gawk} installato su sistemi
 5106 conformi a POSIX.
 5107 Col valore di @samp{exact}, @command{gawk} usa la dimensione di ogni file di
 5108 input come dimensione del buffer di memoria da allocare per I/O.  Altrimenti,
 5109 il valore dovrebbe essere un numero, e @command{gawk} usa questo numero come
 5110 dimensione del buffer da allocare.  (Quando questa variabile non @`e impostata,
 5111 @command{gawk} usa la pi@`u piccola tra le dimensioni del file e la dimensione
 5112 del blocco di ``default'', che normalmente @`e la dimensione del blocco I/O
 5113 del filesystem).
 5114 
 5115 @item AWK_HASH
 5116 Se questa variabile @`e impostata con un valore di @samp{gst}, @command{gawk}
 5117 usa la funzione hash di GNU Smalltalk per gestire i vettori.
 5118 Questa funzione pu@`o essere leggermente pi@`u veloce della funzione standard.
 5119 @item AWKREADFUNC
 5120 Se questa variabile esiste, @command{gawk} legge i file sorgenti una riga per
 5121 volta, anzich@'e a blocchi.  Questa variabile @`e presente
 5122 per problemi di debug su filesystem di sistemi operativi non POSIX,
 5123 dove l'I/O @`e elaborato a record, non a blocchi.
 5124 
 5125 @item GAWK_MSG_SRC
 5126 Se questa variabile esiste, @command{gawk} include il @value{FN} e il
 5127 numero di riga all'interno del codice sorgente @command{gawk}
 5128 dal quale sono stati generati i messaggi di avvertimento o
 5129 i messaggi di errore grave.  Il suo intento @`e quello di aiutare a isolare
 5130 l'origine di un messaggio, poich@'e ci possono essere pi@`u righe di codice che
 5131 producono lo stesso messaggio di avvertimento o di errore.
 5132 
 5133 @item GAWK_LOCALE_DIR
 5134 Specifica la posizione dei file oggetto compilati contenenti la traduzione dei
 5135 messaggi emessi da @command{gawk} stesso. Questa variabile @`e passata alla
 5136 funzione @code{bindtextdomain()} nella fase di partenza di @command{gawk}.
 5137 
 5138 @item GAWK_NO_DFA
 5139 Se questa variabile esiste, @command{gawk} non usa il riconoscitore di
 5140 espressioni regolari ASFD [automa a stati finiti deterministico] per i tipi di
 5141 test di corrispondenza.  Questo pu@`o causare un rallentamento di @command{gawk}.
 5142 Il suo intento @`e quello di aiutare a isolare le differenze tra i due
 5143 riconoscitori di espressioni regolari che @command{gawk} usa internamente (non
 5144 dovrebbero esserci differenze, ma a volte la teoria non coincide con la
 5145 pratica).
 5146 
 5147 @item GAWK_STACKSIZE
 5148 Specifica di quanto @command{gawk} dovrebbe accrescere il suo stack di
 5149 valutazione interno, all'occorrenza.
 5150 
 5151 @item INT_CHAIN_MAX
 5152 Specifica il numero massimo previsto di elementi che @command{gawk} mantiene
 5153 su una catena hash per gestire i vettori indicizzati da numeri interi.
 5154 
 5155 @item STR_CHAIN_MAX
 5156 Specifica il numero massimo previsto di elementi che @command{gawk} mantiene
 5157 su una catena hash per gestire i vettori indicizzati da stringhe.
 5158 
 5159 @item TIDYMEM
 5160 Se questa variabile esiste, @command{gawk} usa le chiamate di libreria
 5161 @code{mtrace()} della @dfn{GNU C library} per aiutare a scoprire
 5162 possibili sprechi di memoria.
 5163 @end table
 5164 
 5165 @node Codice di ritorno
 5166 @section Il codice di ritorno all'uscita da @command{gawk}
 5167 
 5168 @cindex codice di ritorno @subentry di @command{gawk}
 5169 @cindex stato d'uscita @subentry di @command{gawk}
 5170 Se l'istruzione @code{exit} viene usata con un valore
 5171 (@pxref{Istruzione exit}), @command{gawk} termina l'esecuzione con il valore
 5172 numerico specificato.
 5173 
 5174 Altrimenti, se non ci sono stati problemi durante l'esecuzione,
 5175 @command{gawk} esce col valore della costante C
 5176 @code{EXIT_SUCCESS}, che normalmente @`e zero.
 5177 
 5178 Se si verifica un errore, @command{gawk} esce col valore della
 5179 costante C @code{EXIT_FAILURE}, che normalmente @`e uguale a uno.
 5180 
 5181 Se @command{gawk} esce a causa di un errore grave, il codice di ritorno
 5182 @`e due.  Sui sistemi non POSIX questo valore pu@`o essere mappato
 5183 a @code{EXIT_FAILURE}.
 5184 
 5185 @node Includere file
 5186 @section Come includere altri file nel proprio programma
 5187 
 5188 @c Panos Papadopoulos <panos1962@gmail.com> contributed the original
 5189 @c text for this section.
 5190 
 5191 @ifnotinfo
 5192 Questa
 5193 @end ifnotinfo
 5194 @ifinfo
 5195 Questo
 5196 @end ifinfo
 5197 @value{SECTION} descrive una funzionalit@`a disponibile solo in
 5198 @command{gawk}.
 5199 
 5200 @cindex @code{@@} (chiocciola) @subentry @code{@@include} (direttiva)
 5201 @cindex chiocciola (@code{@@}) @subentry @code{@@include} (direttiva)
 5202 @cindex direttiva @subentry @code{@@include}
 5203 @cindex file @subentry includere, direttiva @code{@@include}
 5204 @cindex caricare estensioni @subentry @code{@@load} (direttiva)
 5205 @cindex estensioni @subentry caricare @subentry @code{@@load} (direttiva)
 5206 @cindex includere file @subentry direttiva @code{@@include}
 5207 La direttiva @code{@@include} pu@`o essere usata per leggere file sorgenti
 5208 di @command{awk} esterni.  Questo d@`a la possibilit@`a di suddividere file
 5209 sorgenti di @command{awk} di grandi dimensioni in porzioni pi@`u piccole e pi@`u
 5210 maneggevoli, e anche di riutilizzare codice @command{awk} di uso comune
 5211 da diversi @dfn{script} @command{awk}.  In altre parole, si possono
 5212 raggruppare funzioni di @command{awk} usate per eseguire determinati compiti
 5213 all'interno di file esterni.  Questi  file possono essere usati proprio come
 5214 librerie di funzioni, usando la direttiva @code{@@include} assieme alla
 5215 variabile d'ambiente @env{AWKPATH}.  Si noti che i file sorgenti possono
 5216 venire inclusi anche usando l'opzione @option{-i}.
 5217 
 5218 Vediamolo con un esempio.
 5219 Iniziamo con due @dfn{script} @command{awk} (banali), che chiameremo
 5220 @file{test1} e @file{test2}.  Questo @`e lo @dfn{script} @file{test1}:
 5221 
 5222 @example
 5223 BEGIN @{
 5224     print "Questo @`e lo script test1."
 5225 @}
 5226 @end example
 5227 
 5228 @noindent
 5229 e questo @`e @file{test2}:
 5230 
 5231 @example
 5232 @@include "test1"
 5233 BEGIN @{
 5234     print "Questo @`e lo script test2."
 5235 @}
 5236 @end example
 5237 
 5238 L'esecuzione di @command{gawk} con @file{test2}
 5239 produce il seguente risultato:
 5240 
 5241 @example
 5242 $ @kbd{gawk -f test2}
 5243 @print{} Questo @`e lo script test1.
 5244 @print{} Questo @`e lo script test2.
 5245 @end example
 5246 
 5247 @command{gawk} esegue lo @dfn{script} @file{test2}, il quale include
 5248 @file{test1}, usando la direttiva @code{@@include}.
 5249 Cos@`{@dotless{i}}, per includere file sorgenti di @command{awk} esterni, basta usare
 5250 @code{@@include} seguito dal nome del file da includere,
 5251 racchiuso tra doppi apici.
 5252 
 5253 @quotation NOTA
 5254 Si tenga presente che questo @`e un costrutto del linguaggio e che @value{FN}
 5255 non pu@`o essere una variabile di tipo stringa, ma solo una costante di tipo
 5256 letterale racchiusa tra doppi apici.
 5257 @end quotation
 5258 
 5259 I file da includere possono essere nidificati; p.es., dato un terzo
 5260 @dfn{script}, che chiameremo @file{test3}:
 5261 
 5262 @example
 5263 @group
 5264 @@include "test2"
 5265 BEGIN @{
 5266     print "Questo @`e lo script test3."
 5267 @}
 5268 @end group
 5269 @end example
 5270 
 5271 @noindent
 5272 L'esecuzione di @command{gawk} con lo @dfn{script} @file{test3} produce i
 5273 seguenti risultati:
 5274 
 5275 @example
 5276 $ @kbd{gawk -f test3}
 5277 @print{} Questo @`e lo script test1.
 5278 @print{} Questo @`e lo script test2.
 5279 @print{} Questo @`e lo script test3.
 5280 @end example
 5281 
 5282 Il @value{FN}, naturalmente, pu@`o essere un nome di percorso.
 5283 Per esempio:
 5284 
 5285 @example
 5286 @@include "../funzioni_di_i_o"
 5287 @end example
 5288 
 5289 @noindent
 5290 e:
 5291 
 5292 @example
 5293 @@include "/usr/awklib/network"
 5294 @end example
 5295 
 5296 @noindent
 5297 sono entrambi percorsi validi.  La variabile d'ambiente @env{AWKPATH} pu@`o
 5298 rivestire grande importanza quando si usa @code{@@include}.  Le stesse
 5299 regole per l'uso della variabile d'ambiente @env{AWKPATH} nelle ricerche
 5300 da riga di comando
 5301 (@pxref{AWKPATH (Variabile)}) si applicano anche a
 5302 @code{@@include}.
 5303 
 5304 Questo @`e di grande aiuto nella costruzione di librerie di funzioni di
 5305 @command{gawk}.  Se si ha uno @dfn{script} di grandi dimensioni contenente
 5306 utili funzioni @command{awk} di uso comune, lo si pu@`o suddividere in file
 5307 di libreria e mettere questi file in una directory dedicata.  In seguito si
 5308 possono includere queste ``librerie'' usando il percorso completo dei
 5309 file, o impostando opportunamente la variabile d'ambiente @env{AWKPATH} e
 5310 quindi usando @code{@@include} con la sola parte del percorso completo che
 5311 designa il file.  Naturalmente,
 5312 si possono tenere i file di libreria in pi@`u di una directory;
 5313 pi@`u @`e complesso l'ambiente di lavoro, pi@`u
 5314 directory possono essere necessarie per organizzare i file da includere.
 5315 
 5316 Vista la possibilit@`a di specificare opzioni @option{-f} multiple, il
 5317 meccanismo @code{@@include} non @`e strettamente necessario.
 5318 Comunque, la direttiva @code{@@include} pu@`o essere d'aiuto nel costruire
 5319 programmi @command{gawk} autosufficienti, riducendo cos@`{@dotless{i}} la necessit@`a
 5320 di scrivere righe di comando complesse e tediose.
 5321 In particolare, @code{@@include} @`e molto utile per scrivere @dfn{script} CGI
 5322 eseguibili da pagine web.
 5323 
 5324 Le regole usate per trovare un file sorgente, descritte in
 5325 @ref{AWKPATH (Variabile)}, valgono anche per i file
 5326 caricati tramite @code{@@include}.
 5327 
 5328 Infine, i file inclusi con @code{@@include} sono considerati
 5329 appartenere allo spazio-dei-nomi @samp{"awk" (@@namespace "awk")}
 5330 a inizio programma. @xref{Cambiare lo spazio-dei-nomi}, per ulteriori
 5331 informazioni.
 5332 
 5333 @node Caricare librerie condivise
 5334 @section Caricare librerie condivise nel proprio programma
 5335 
 5336 @ifnotinfo
 5337 Questa
 5338 @end ifnotinfo
 5339 @ifinfo
 5340 Questo
 5341 @end ifinfo
 5342 @value{SECTION} descrive una funzionalit@`a disponibile solo in
 5343 @command{gawk}.
 5344 
 5345 @cindex @code{@@} (chiocciola) @subentry @code{@@load} (direttiva)
 5346 @cindex chiocciola (@code{@@}) @subentry @code{@@load} (direttiva)
 5347 @cindex caricare estensioni @subentry direttiva @code{@@load}
 5348 @cindex estensioni @subentry caricare @subentry direttiva @code{@@load}
 5349 La direttiva @code{@@load} pu@`o essere usata per leggere estensioni di
 5350 @command{awk} esterne (memorizzate come librerie condivise di sistema).
 5351 Questo consente di collegare del codice compilato che pu@`o offrire prestazioni
 5352 migliori o dare l'accesso a funzionalit@`a estese non incluse nel linguaggio
 5353 @command{awk}.  La variabile @env{AWKLIBPATH} viene usata per ricercare
 5354 l'estensione.  Usare @code{@@load} @'e del tutto equivalente a usare l'opzione da
 5355 riga di comando @option{-l}.
 5356 
 5357 Se l'estensione non viene trovata in @env{AWKLIBPATH}, viene effettuata
 5358 un'altra ricerca dopo aver aggiunto al @value{FN} il suffisso della
 5359 libreria condivisa comunemente in uso per la piattaforma corrente.  Per
 5360 esempio, sui sistemi GNU/Linux viene usato il suffisso @samp{.so}:
 5361 
 5362 @example
 5363 $ @kbd{gawk '@@load "ordchr"; BEGIN @{print chr(65)@}'}
 5364 @print{} A
 5365 @end example
 5366 
 5367 @noindent
 5368 Questo equivale all'esempio seguente:
 5369 
 5370 @example
 5371 @group
 5372 $ @kbd{gawk -lordchr 'BEGIN @{print chr(65)@}'}
 5373 @print{} A
 5374 @end group
 5375 @end example
 5376 
 5377 @noindent
 5378 Per l'uso da riga di comando @`e pi@`u conveniente l'opzione @option{-l},
 5379 ma @code{@@load} @`e utile da inserire all'interno di un file sorgente di
 5380 @command{awk} che richieda l'accesso a un'estensione.
 5381 
 5382 @ref{Estensioni dinamiche}, descrive come scrivere estensioni (in C or C++)
 5383 che possono essere caricate sia con @code{@@load} che con l'opzione
 5384 @option{-l}.  @`E anche descritta l'estensione @code{ordchr}.
 5385 
 5386 @node Parti obsolete
 5387 @section Opzioni e/o funzionalit@`a obsolete
 5388 
 5389 @c update this section for each release!
 5390 
 5391 @cindex opzioni @subentry deprecate
 5392 @cindex funzionalit@`a @subentry deprecate
 5393 @cindex obsolete @subentry funzionalit@`a
 5394 @ifnotinfo
 5395 Questa
 5396 @end ifnotinfo
 5397 @ifinfo
 5398 Questo
 5399 @end ifinfo
 5400 @value{SECTION} descrive funzionalit@`a o opzioni da riga di comando
 5401 provenienti da precedenti versioni di @command{gawk} che non sono pi@`u
 5402 disponibili nella versione corrente, o che sono ancora utilizzabili ma sono
 5403 deprecate (ci@`o significa che @emph{non} saranno presenti nella prossima
 5404 versione).
 5405 
 5406 I file speciali relativi ai processi @file{/dev/pid}, @file{/dev/ppid},
 5407 @file{/dev/pgrpid} e @file{/dev/user} erano deprecati, ma ancora disponibili,
 5408 in @command{gawk} 3.1.  A partire dalla @value{PVERSION} 4.0, non sono
 5409 pi@`u interpretati da @command{gawk} in modo speciale (al loro posto usare
 5410 invece @code{PROCINFO}; si veda @ref{Variabili auto-assegnate}).
 5411 
 5412 @ignore
 5413 This @value{SECTION}
 5414 is thus essentially a place holder,
 5415 in case some option becomes obsolete in a future version of @command{gawk}.
 5416 @end ignore
 5417 
 5418 @node Non documentato
 5419 @section Opzioni e funzionalit@`a non documentate
 5420 @cindex non documentate @subentry funzionalit@`a
 5421 @cindex funzionalit@`a @subentry non documentate
 5422 @cindex Skywalker, Luke
 5423 @cindex Kenobi, Obi-Wan
 5424 @cindex jedi, cavalieri
 5425 @cindex cavalieri jedi
 5426 @quotation
 5427 @i{Usa il codice sorgente, Luke!}
 5428 @author Obi-Wan
 5429 @end quotation
 5430 
 5431 @cindex conchiglie @subentry mare
 5432 @ifnotinfo
 5433 Questa @value{SECTION} @`e stata lasciata intenzionalmente vuota.
 5434 @end ifnotinfo
 5435 @ifinfo
 5436 Questo @value{SECTION} @`e stato lasciato intenzionalmente vuoto.
 5437 @end ifinfo
 5438 
 5439 @ignore
 5440 @c If these came out in the Info file or TeX document, then they wouldn't
 5441 @c be undocumented, would they?
 5442 
 5443 @command{gawk} ha un'opzione non documentata:
 5444 
 5445 @table @code
 5446 @item -W nostalgia
 5447 @itemx --nostalgia
 5448 Stampa il messaggio @samp{awk: bailing out near line 1} e termina
 5449 con un errore grave.
 5450 Quest'opzione @`e stata ispirata dal comportamento comune delle primissime
 5451 versioni di @command{awk} Unix e da una maglietta [con la scritta].
 5452 Il messaggio @emph{NON} viene tradotto in ambienti non inglesi.
 5453 @c so there! nyah, nyah.
 5454 @end table
 5455 
 5456 Le prime versioni di @command{awk} non richiedevano alcun separatore (a capo
 5457 
 5458 o @samp{;}) tra le regole nei programmi @command{awk}.  Quindi,
 5459 era normale vedere programmi di una riga come:
 5460 
 5461 @example
 5462 awk '@{ sum += $1 @} END @{ print sum @}'
 5463 @end example
 5464 
 5465 @command{gawk} in realt@`a consente questo stile, ma la cosa non @`e
 5466 documentata per non incoraggiare la pratica.  Il modo corretto per scrivere
 5467 quel programma @`e uno dei
 5468 seguenti:
 5469 
 5470 @example
 5471 awk '@{ sum += $1 @} ; END @{ print sum @}'
 5472 @end example
 5473 
 5474 @noindent
 5475 oppure:
 5476 
 5477 @example
 5478 awk '@{ sum += $1 @}
 5479      END @{ print sum @}' data
 5480 @end example
 5481 
 5482 @noindent
 5483 @xref{Istruzioni/Righe}, per una spiegazione pi@`u ampia.
 5484 
 5485 Si possono inserire righe bianche dopo @samp{;} nei cicli @code{for}.
 5486 Questa sembre essere stata una funzionalit@`a a lungo non documentata in
 5487 @command{awk} Unix.
 5488 
 5489 Analogamente, si possono usare istruzioni @code{print} o @code{printf}
 5490 nelle parti @var{valore-iniziale} e @var{incremento} di un ciclo
 5491 @code{for}.  Questa @`e un'altra funzionalit@`a a lungo non documentata in
 5492 @command{awk} Unix.
 5493 
 5494 @command{gawk} consente di usare come nomi di parametro dei
 5495 nomi di funzioni predefinite che facciano parte delle estensioni
 5496 @command{gawk}, all'interno di funzioni definite dall'utente.
 5497 Questo avviene per ``salvaguardare per il futuro'' vecchi programmi che
 5498 utilizzino nomi di funzioni aggiunte da @command{gawk} dopo che questi
 5499 programmi erano stati scritti.
 5500 Le funzioni predefinite standard di command{awk}, per esempio
 5501 @code{sin()} o @code{substr()} @emph{non} ammettono questa possibilit@`a.
 5502 
 5503 @`E possibile specificare in @code{printf} un modificatore @samp{P}
 5504 fra le lettere di controllo dei numeri in virgola mobile, per
 5505 utilizzare il risultato fornito dalle funzioni di libreria C
 5506 per i valori NaN [Non un Numero] e Infinity [Infinito], invece dei
 5507 valori speciali normalmente prodotti da @command{gawk}, come
 5508 descritto in @ref{Problemi virgola mobile POSIX}.
 5509 Questo serve principalmente nella fase di test delle componenti aggiunte.
 5510 
 5511 La funzione predefinita @code{typeof()}
 5512 (@pxref{Funzioni per i tipi})
 5513 accetta un nome di vettore, opzionale, come secondo argomento, il quale,
 5514 se presente sar@`a svuotato degli eventuali contenuti, e riempito con
 5515 alcune informazioni che descrivono l'implementazione interna della
 5516 variabile.  Ci@`o pu@`o essere utile per il debug.  Per ora viene
 5517 restituita una versione formato testo dei flag per le variabili di
 5518 tipo scalare, e il tipo di implementazione interna per i vettori.
 5519 Per quest'interfaccia sono possibili variazioni in futuro, e quindi
 5520 i valori restituiti possono non rimanere fissi.
 5521 
 5522 Se non si @`e in modalit@`a POSIX o in modalit@`a compatibile, impostando
 5523 code{LINENO} a un valore numerico, per mezzo dell'opzione @option{-v},
 5524 @command{gawk} aggiunge il valore specificato al numero di riga del
 5525 programma, nei messaggi di errore.  Ci@`o serve qualora il programma
 5526 sia contenuto in uno @dfn{script} Bash,
 5527 per far s@`{@dotless{i}} che il messaggio di errore
 5528 rispecchi il numero di riga corrispondente nello @dfn{script} Bash, invece
 5529 del numero di riga del programma @command{gawk} vero e proprio.
 5530 Si veda l'esempio seguente:
 5531 
 5532 @example
 5533 $ @kbd{gawk -v LINENO=10 'BEGIN @{ print("hi" @}'}
 5534 @error{} gawk: riga com.:11: BEGIN @{ print("hi" @}
 5535 @error{} gawk: riga com.:11:                    ^ syntax error
 5536 @end example
 5537 
 5538 @end ignore
 5539 
 5540 @node Sommario invocazione
 5541 @section Sommario
 5542 
 5543 @itemize @value{BULLET}
 5544 
 5545 @c From Neil R. Ormos
 5546 @item
 5547 @command{gawk} esamina gli argomenti sulla riga dei comandi da sinistra a
 5548 destra per stabilire se vanno trattati come opzioni o come non-opzioni
 5549 (le non-opzioni sono il programma da eseguire e/o i file su cui operare).
 5550 
 5551 @item
 5552 @command{gawk} riconosce parecchie opzioni che ne controllano il modo di
 5553 operare, come descritto in @ref{Opzioni}.  Tutte le opzioni iniziano con
 5554 @samp{-}.
 5555 
 5556 @item
 5557 Ogni argomento esaminato che non viene riconosciuto come un'opzione @`e
 5558 considerato essere un argomento "non-opzione" anche se inizia con @samp{-}.
 5559 
 5560 @itemize @value{MINUS}
 5561 @item
 5562 Tuttavia, quando un'opzione richiede un argomento, e l'opzione @`e separata
 5563 da quell'argomento da almeno uno spazio, lo spazio @`e ignorato, e
 5564 l'argomento @`e considerato essere relativo a quell'opzione.  Quindi, se
 5565 si scrive @samp{gawk -F x}, l'argomento @samp{x} @`e considerato come
 5566 appartenente all'opzione @option{-F}, e non come un argomento "non-opzione"
 5567 separato.
 5568 @end itemize
 5569 
 5570 Dopo che @command{gawk} ha trovato il primo argomento "non-opzione",
 5571 sospende la ricerca di ulteriori opzioni.  Quindi, tutti gli argomenti
 5572 successivi che vengono trovati sono considerati argomenti "non-opzione",
 5573 anche se sono simili a opzioni riconosciute.
 5574 
 5575 @item
 5576 Se non sono state specificate n@'e l'opzione @option{-e} n@'e l'opzione
 5577 @option{-f} @command{gawk} si aspetta che il testo del programma
 5578 sia contenuto nel primo argomento "non-opzione".
 5579 
 5580 @item
 5581 Tutti gli argomenti "non-opzione", tranne il testo del programma
 5582 specificato come primo argomento "non-opzione" sono messi nel vettore
 5583 @code{ARGV} come spiegato in @ref{ARGC e ARGV}, e sono trattati come
 5584 descritto in @ref{Altri argomenti}.
 5585 @c And I wrote:
 5586 Modificando le variabili @code{ARGC} e @code{ARGV}
 5587 si cambia il modo in cui @command{awk} tratta i file in input.
 5588 
 5589 @c ----------------------------------------
 5590 
 5591 @item
 5592 Le tre opzioni standard per tutte le versioni di @command{awk} sono
 5593 @option{-f}, @option{-F} e @option{-v}.  @command{gawk} fornisce queste e
 5594 molte altre, come pure le opzioni estese corrispondenti scritte in stile GNU.
 5595 
 5596 @item
 5597 Gli argomenti da riga di comando che non sono opzioni sono trattati normalmente
 5598 come @value{FNS}, a meno che non abbiano la forma @samp{@var{var}=@var{valore}};
 5599 nel qual caso vengono riconosciuti come assegnamenti di variabile da eseguire
 5600 in quel punto
 5601 nell'elaborazione dell'input.
 5602 
 5603 @item
 5604 Si pu@`o usare un segno meno a s@'e stante (@samp{-}) per designare lo standard
 5605 input sulla riga di comando.  @command{gawk} consente anche di usare il
 5606 @value{FN} speciale @file{/dev/stdin}.
 5607 
 5608 @item
 5609 @command{gawk} tiene conto di diverse variabili d'ambiente;
 5610 @env{AWKPATH}, @env{AWKLIBPATH} e @env{POSIXLY_CORRECT} sono le
 5611 pi@`u importanti.
 5612 
 5613 @item
 5614 Lo stato d'uscita di @command{gawk} invia informazioni al programma che lo
 5615 ha invocato.  Usare l'istruzione @code{exit} dall'interno di un programma
 5616 @command{awk} per impostare il codice di ritorno.
 5617 
 5618 @item
 5619 @command{gawk} consente di includere nel proprio programma file sorgenti di
 5620 @command{awk} con la direttiva @code{@@include} o con le opzioni da riga di
 5621 comando  @option{-i} e @option{-f}.
 5622 
 5623 @item
 5624 @command{gawk} consente di caricare funzioni aggiuntive scritte in C
 5625 o C++ con la direttiva @code{@@load} e/o con l'opzione @option{-l}
 5626 (questa funzionalit@`a avanzata @`e descritta pi@`u avanti, in
 5627 @ref{Estensioni dinamiche}).
 5628 @end itemize
 5629 @node Espressioni regolari
 5630 @chapter Espressioni regolari
 5631 @cindex @dfn{regexp}
 5632 @cindex espressioni regolari
 5633 
 5634 Una @dfn{espressione regolare}, o @dfn{regexp}, @`e un modo per descrivere un
 5635 insieme di stringhe.
 5636 Poich@'e le espressioni regolari sono una parte fondamentale della
 5637 programmazione in @command{awk}, il loro formato e il loro uso meritano un
 5638 @value{CHAPTER} a s@'e stante.
 5639 
 5640 @cindex barra (@code{/}) @subentry per delimitare le espressioni regolari
 5641 @cindex @code{/} (barra) @subentry per delimitare le espressioni regolari
 5642 Un'espressione regolare racchiusa tra barre (@samp{/})
 5643 @`e un modello di ricerca @command{awk} che individua tutti i record in input
 5644 il cui testo corrisponde al modello stesso.
 5645 L'espressione regolare pi@`u semplice @`e una sequenza di lettere o di numeri, o
 5646 di entrambi.  Una tale @dfn{regexp} individua ogni stringa che contenga quella
 5647 particolare sequenza.
 5648 Quindi, la @dfn{regexp} @samp{pippo} individua ogni stringa che contenga
 5649 @samp{pippo}.  In altre parole, al modello di ricerca @code{/pippo/} corrisponde
 5650 ogni record in input che contiene i cinque caratteri consecutivi @samp{pippo}
 5651 @emph{in qualsiasi parte} del record.  Altri tipi di @dfn{regexp} permettono
 5652 di specificare classi di stringhe molto pi@`u complesse.
 5653 
 5654 @ifnotinfo
 5655 All'inizio, gli esempi in questo @value{CHAPTER} sono semplici.
 5656 Man mano che entriamo nei dettagli su
 5657 come funzionano le espressioni regolari utilizzeremo formulazioni pi@`u
 5658 complesse.
 5659 @end ifnotinfo
 5660 
 5661 @menu
 5662 * Uso di @dfn{regexp}::                 Come usare le espressioni regolari.
 5663 * Sequenze di protezione::              Come scrivere caratteri non stampabili.
 5664 * Operatori di espressioni regolari::   Operatori di espressioni regolari.
 5665 * Espressioni tra parentesi quadre::    Cosa possono contenere @samp{[...]}.
 5666 * Pi@`u lungo da sinistra::               Quanto @`e lungo il testo individuato.
 5667 * Espressioni regolari calcolate::      Usare @dfn{regexp} dinamiche.
 5668 * Operatori di @dfn{regexp} GNU::       Operatori propri del software GNU.
 5669 * Maiuscolo-Minuscolo::                 Fare confronti ignorando
 5670                                         maiuscolo/minuscolo.
 5671 * Sommario espressioni regolari::       Sommario delle espressioni regolari.
 5672 @end menu
 5673 
 5674 @node Uso di @dfn{regexp}
 5675 @section Uso di espressioni regolari
 5676 
 5677 @cindex criteri di ricerca @subentry espressioni regolari come
 5678 @cindex espressioni regolari @subentry come criteri di ricerca
 5679 Un'espressione regolare pu@`o essere usata come modello di ricerca
 5680 racchiudendola tra barre.  L'espressione regolare @`e quindi confrontata
 5681 con tutto il testo di ogni record (normalmente, basta che corrisponda a
 5682 una parte qualsiasi del testo per risultare soddisfatta).  Per esempio,
 5683 il seguente programma stampa il secondo campo di ogni record in cui compaia
 5684 la stringa @samp{li}, in qualsiasi parte del record:
 5685 
 5686 @example
 5687 $ @kbd{awk '/li/ @{ print $2 @}' mail-list}
 5688 @print{} 555-5553
 5689 @print{} 555-0542
 5690 @print{} 555-6699
 5691 @print{} 555-3430
 5692 @end example
 5693 
 5694 @cindex espressioni regolari @subentry operatori
 5695 @cindex operatori @subentry ricerca in stringhe
 5696 @c @cindex operators, @code{~}
 5697 @cindex ricerca @subentry in stringhe, operatori
 5698 @cindex @code{~} (tilde) @subentry operatore @code{~}
 5699 @cindex tilde (@code{~}) @subentry operatore @code{~}
 5700 @cindex @code{!} (punto esclamativo) @subentry operatore @code{!~}
 5701 @cindex punto esclamativo (@code{!}) @subentry operatore @code{!~}
 5702 @c @cindex operators, @code{!~}
 5703 @cindex @code{if} (istruzione) @subentry uso di espressioni regolari in
 5704 @cindex @code{while} (istruzione) @subentry uso di espressioni regolari in
 5705 @cindex @code{do}-@code{while} (istruzione) @subentry uso di espressioni regolari in
 5706 @c @cindex statement @code{if}
 5707 @c @cindex statement @code{while}
 5708 @c @cindex statement @code{do}
 5709 Espressioni regolari possono anche essere usate in espressioni di confronto.
 5710 Queste espressioni consentono di specificare le stringhe da riconoscere;
 5711 non devono necessariamente comprendere l'intero record corrente.  I due
 5712 operatori @samp{~} e @samp{!~} confrontano espressioni regolari.  Le
 5713 espressioni che usano questi operatori possono essere usate come modelli di
 5714 ricerca, o nelle istruzioni @code{if}, @code{while}, @code{for}, e @code{do}.
 5715 (@xref{Istruzioni}.)
 5716 Per esempio:
 5717 
 5718 @example
 5719 @var{exp} ~ /@var{regexp}/
 5720 @end example
 5721 
 5722 @noindent
 5723 @`e verificata se l'espressione @var{exp} (intesa come stringa)
 5724 corrisponde a @var{regexp}.  L'esempio che segue individua, o sceglie,
 5725 tutti i record in input in cui la lettera maiuscola @samp{J} @`e presente da
 5726 qualche parte nel primo campo:
 5727 
 5728 @example
 5729 $ @kbd{awk '$1 ~ /J/' inventory-shipped}
 5730 @print{} Jan  13  25  15 115
 5731 @print{} Jun  31  42  75 492
 5732 @print{} Jul  24  34  67 436
 5733 @print{} Jan  21  36  64 620
 5734 @end example
 5735 
 5736 Lo stesso risultato si pu@`o ottenere anche cos@`{@dotless{i}}:
 5737 
 5738 @example
 5739 awk '@{ if ($1 ~ /J/) print @}' inventory-shipped
 5740 @end example
 5741 
 5742 Il prossimo esempio chiede che l'espressione @var{exp}
 5743 (intesa come stringa)
 5744 @emph{NON} corrisponda a @var{regexp}:
 5745 
 5746 @example
 5747 @var{exp} !~ /@var{regexp}/
 5748 @end example
 5749 
 5750 L'esempio che segue individua o sceglie tutti i record in input il cui
 5751 primo campo @emph{NON} contiene
 5752 la lettera maiuscola @samp{J}:
 5753 
 5754 @example
 5755 $ @kbd{awk '$1 !~ /J/' inventory-shipped}
 5756 @print{} Feb  15  32  24 226
 5757 @print{} Mar  15  24  34 228
 5758 @print{} Apr  31  52  63 420
 5759 @print{} May  16  34  29 208
 5760 @dots{}
 5761 @end example
 5762 
 5763 @cindex @dfn{regexp} @subentry costanti
 5764 @cindex costanti @subentry @dfn{regexp}
 5765 @cindex espressioni regolari @subentry costanti @seeentry{costanti @dfn{regexp}}
 5766 Quando una @dfn{regexp} @`e racchiusa tra barre, come @code{/pippo/}, la chiamiamo
 5767 una @dfn{costante regexp}, proprio come @code{5.27} @`e una costante
 5768 numerica e @code{"pippo"} @`e una costante [di tipo] stringa.
 5769 
 5770 @node Sequenze di protezione
 5771 @section Sequenze di protezione
 5772 
 5773 @cindex sequenze di protezione
 5774 @cindex sequenze di protezione @subentry in stringhe
 5775 @cindex barra inversa (@code{\}) @subentry in sequenze di protezione
 5776 @cindex @code{\} (barra inversa) @subentry in sequenze di protezione
 5777 Alcuni caratteri non possono essere inclusi letteralmente in costanti
 5778 stringa (@code{"pippo"}) o in costanti @dfn{regexp} (@code{/pippo/}).
 5779 Vanno invece rappresentati usando @dfn{sequenze di protezione},
 5780 ossia sequenze di caratteri preceduti da una barra inversa (@samp{\}).
 5781 Una sequenza di protezione pu@`o essere usata per includere un carattere di
 5782 "doppio apice" in una costante stringa.  Poich@'e un semplice doppio apice
 5783 termina la stringa, va usato @samp{\"} per richiedere che un doppio apice sia
 5784 presente all'interno di una stringa.  Per esempio:
 5785 
 5786 @example
 5787 $ @kbd{awk 'BEGIN @{ print "Egli le disse \"ciao!\"." @}'}
 5788 @print{} Egli le disse "ciao!".
 5789 @end example
 5790 
 5791 Lo stesso carattere di barra inversa @`e un altro carattere che non pu@`o essere
 5792 incluso normalmente; occorre scrivere @samp{\\} per inserire una barra
 5793 inversa nella stringa o @dfn{regexp}.  Quindi, la stringa costituita dai due
 5794 caratteri @samp{"} e @samp{\} deve essere scritta come @code{"\"\\"}.
 5795 
 5796 Altre sequenze di protezione rappresentano caratteri non stampabili
 5797 come TAB o il ritorno a capo.  Anche se @`e possibile immettere la maggior parte dei
 5798 caratteri non stampabili direttamente in una costante stringa o
 5799 @dfn{regexp}, essi possono non essere di facile comprensione.
 5800 
 5801 La seguente lista elenca
 5802 tutte le sequenze di protezione usate in @command{awk} e
 5803 cosa rappresentano.  Se non @`e detto altrimenti, tutte queste sequenze di
 5804 protezione valgono sia per costanti stringa che per costanti @dfn{regexp}:
 5805 
 5806 @cindex ASCII
 5807 @table @code
 5808 @item \\
 5809 Barra inversa letterale, @samp{\}.
 5810 
 5811 @c @cindex @command{awk} language, V.4 version
 5812 @cindex @code{\} (barra inversa) @subentry @code{\a} (sequenza di protezione)
 5813 @cindex barra inversa (@code{\}) @subentry @code{\a} (sequenza di protezione)
 5814 @item \a
 5815 Il carattere ``campanello'', @kbd{Ctrl-g}, codice ASCII 7 (BEL).
 5816 (Spesso genera qualche tipo di segnale sonoro udibile.)
 5817 
 5818 @cindex @code{\} (barra inversa) @subentry @code{\b} (sequenza di protezione)
 5819 @cindex barra inversa (@code{\}) @subentry @code{\b} (sequenza di protezione)
 5820 @item \b
 5821 Barra inversa, @kbd{Ctrl-h}, codice ASCII 8 (BS).
 5822 
 5823 @cindex @code{\} (barra inversa) @subentry @code{\f} (sequenza di protezione)
 5824 @cindex barra inversa (@code{\}) @subentry @code{\f} (sequenza di protezione)
 5825 @item \f
 5826 Nuova pagina, @kbd{Ctrl-l}, codice ASCII 12 (FF).
 5827 
 5828 @cindex @code{\} (barra inversa) @subentry @code{\n} (sequenza di protezione)
 5829 @cindex barra inversa (@code{\}) @subentry @code{\n} (sequenza di protezione)
 5830 @item \n
 5831 A-capo, @kbd{Ctrl-j}, codice ASCII 10 (LF).
 5832 
 5833 @cindex @code{\} (barra inversa) @subentry @code{\r} (sequenza di protezione)
 5834 @cindex barra inversa (@code{\}) @subentry @code{\r} (sequenza di protezione)
 5835 @item \r
 5836 Ritorno-a-capo, @kbd{Ctrl-m}, codice ASCII 13 (CR).
 5837 
 5838 @cindex @code{\} (barra inversa) @subentry @code{\t} (sequenza di protezione)
 5839 @cindex barra inversa (@code{\}) @subentry @code{\t} (sequenza di protezione)
 5840 @item \t
 5841 Tabulazione orizzontale, @kbd{Ctrl-i}, codice ASCII 9 (HT).
 5842 
 5843 @c @cindex @command{awk} language, V.4 version
 5844 @cindex @code{\} (barra inversa) @subentry @code{\v} (sequenza di protezione)
 5845 @cindex barra inversa (@code{\}) @subentry @code{\v} (sequenza di protezione)
 5846 @item \v
 5847 Tabulazione verticale, @kbd{Ctrl-k}, codice ASCII 11 (VT).
 5848 
 5849 @cindex @code{\} (barra inversa) @subentry @code{\}@var{nnn} (sequenza di protezione)
 5850 @cindex barra inversa (@code{\}) @subentry @code{\}@var{nnn} (sequenza di protezione)
 5851 @item \@var{nnn}
 5852 Il valore ottale @var{nnn}, dove @var{nnn} pu@`o essere da 1 a 3 cifre ottali,
 5853 tra @samp{0} e @samp{7}.  Per esempio, il codice per il carattere ASCII ESC
 5854 (escape) @`e @samp{\033}.
 5855 
 5856 @c @cindex @command{awk} language, V.4 version
 5857 @c @cindex @command{awk} language, POSIX version
 5858 @cindex @code{\} (barra inversa) @subentry @code{\x} (sequenza di protezione)
 5859 @cindex barra inversa (@code{\}) @subentry @code{\x} (sequenza di protezione)
 5860 @cindex comuni @subentry estensioni @subentry @code{\x}, sequenza di protezione
 5861 @cindex estensioni comuni @subentry @code{\x} (sequenza di protezione)
 5862 @item \x@var{hh}@dots{}
 5863 Il valore esadecimale @var{hh}, dove @var{hh} indica una sequenza di cifre
 5864 esadecimali (@samp{0}--@samp{9}, e @samp{A}--@samp{F}
 5865 o @samp{a}--@samp{f}).  Dopo @samp{\x} @`e consentito un massimo di due cifre.
 5866 Ogni ulteriore cifra esadecimale @`e considerata come una semplice
 5867 lettera o numero.  @value{COMMONEXT}
 5868 (La sequenza di protezione @samp{\x} non @`e permessa in POSIX awk.)
 5869 
 5870 @quotation ATTENZIONE
 5871 In ISO C, la sequenza di protezione continua fino a raggiungere il primo
 5872 carattere che non sia una cifra esadecimale.
 5873 In passato, @command{gawk} avrebbe continuato ad aggiungere
 5874 cifre esadecimali al valore finch@'e non trovava una cifra non esadecimale
 5875 oppure fino a raggiungere la fine della stringa.
 5876 Comunque usare pi@`u di due cifre esadecimali produceva risultati indefiniti.
 5877 Dalla @value{PVERSION} 4.2,
 5878 vengono elaborate solo due cifre.
 5879 @end quotation
 5880 
 5881 @cindex @code{\} (barra inversa) @subentry @code{\/} (sequenza di protezione)
 5882 @cindex barra inversa (@code{\}) @subentry @code{\/} (sequenza di protezione)
 5883 @item \/
 5884 Una barra (dovrebbe essere usato solo per costanti @dfn{regexp}).
 5885 Questa sequenza si usa per inserire una costante @dfn{regexp}
 5886 che contiene una barra
 5887 (come @code{/.*:\/home\/[[:alnum:]]+:.*/}; la notazione @samp{[[:alnum:]]}
 5888 verr@`a spiegata pi@`u avanti,
 5889 @iftex
 5890 nella
 5891 @end iftex
 5892 @ifnottex
 5893 in
 5894 @end ifnottex
 5895 @ref{Espressioni tra parentesi quadre}).
 5896 Poich@'e una @dfn{regexp} @`e racchiusa tra
 5897 barre, si deve proteggere ogni barra che sia parte dell'espressione, per dire
 5898 ad @command{awk} di andare avanti a scandire il resto della @dfn{regexp}.
 5899 
 5900 @cindex @code{\} (barra inversa) @subentry @code{\"} (sequenza di protezione)
 5901 @cindex barra inversa (@code{\}) @subentry @code{\"} (sequenza di protezione)
 5902 @item \"
 5903 Un doppio apice (dovrebbe essere usato solo per costanti stringa).
 5904 Questa sequenza si usa per inserire in una costante stringa il carattere
 5905 doppio apice
 5906 (come @code{"Egli le disse \"ciao!\"."}).
 5907 Poich@'e la stringa @`e racchiusa tra
 5908 doppi apici, si deve proteggere ogni doppio apice che sia parte della stringa
 5909 per dire ad @command{awk} di andare avanti a elaborare il resto della stringa.
 5910 @end table
 5911 
 5912 In @command{gawk}, parecchie altre sequenze di due caratteri inizianti con
 5913 con una barra inversa hanno un significato speciale nelle @dfn{regexp}.
 5914 @ref{Operatori di @dfn{regexp} GNU}.
 5915 
 5916 In una @dfn{regexp}, una barra inversa che preceda un carattere non presente
 5917 nella lista precedente, e non elencato in
 5918 @ref{Operatori di @dfn{regexp} GNU},
 5919 significa che il carattere seguente dovrebbe essere preso letteralmente,
 5920 anche se normalmente sarebbe un operatore di @dfn{regexp}.  Per esempio,
 5921 @code{/a\+b/} individua i tre caratteri @samp{a+b}.
 5922 
 5923 @cindex barra inversa (@code{\}) @subentry in sequenze di protezione
 5924 @cindex @code{\} (barra inversa) @subentry in sequenze di protezione
 5925 @cindex portabilit@`a
 5926 Per una completa portabilit@`a, non usare una barra inversa prima di qualsiasi
 5927 carattere non incluso nella lista precedente, o che non sia un operatore.
 5928 @c 11/2014: Moved so as to not stack sidebars
 5929 @sidebar Barra inversa prima di un carattere normale
 5930 @cindex portabilit@`a @subentry barra inversa in sequenze di protezione
 5931 @cindex POSIX @command{awk} @subentry barre inverse in costanti stringa
 5932 @cindex barra inversa (@code{\}) @subentry in sequenze di protezione @subentry POSIX e
 5933 @cindex @code{\} (barra inversa) @subentry in sequenze di protezione @subentry POSIX e
 5934 
 5935 @cindex risoluzione di problemi @subentry barra inversa prima di caratteri non speciali
 5936 @cindex problemi @subentry risoluzione di @subentry barra inversa prima di caratteri non speciali
 5937 Se si mette una barra inversa in una costante stringa prima di qualcosa che
 5938 non sia uno dei caratteri elencati sopra, POSIX @command{awk} di proposito
 5939 lascia indefinito il comportamento.  Ci sono due possibilit@`a:
 5940 
 5941 @c @cindex automatic warnings
 5942 @c @cindex warnings, automatic
 5943 @cindex Brian Kernighan @subentry @command{awk} di
 5944 @table @asis
 5945 @item Togliere la barra inversa
 5946 Questo @`e quel che sia BWK @command{awk} che @command{gawk} fanno.
 5947 Per esempio, @code{"a\qc"} equivale a @code{"aqc"}.
 5948 (Poich@'e questo @`e un errore che pu@`o capitare o non capitare con la stessa
 5949 probabilit@`a, @command{gawk} lo segnala).
 5950 Volendo usare come separatore di campo @samp{FS = @w{"[ \t]+\|[ \t]+"}}
 5951 ossia delle barre verticali precedute e seguite da almeno uno spazio,
 5952 occorre mettere due barre inverse nella stringa:
 5953 @samp{FS = @w{"[ \t]+\\|[ \t]+"}}.)
 5954 @c I did this!  This is why I added the warning.
 5955 
 5956 @cindex @command{gawk} @subentry sequenze di protezione
 5957 @cindex @command{gawk} @subentry sequenze di protezione @seealso{barra inversa}
 5958 @cindex Unix @command{awk} @subentry barra inversa in sequenze di protezione
 5959 @cindex @command{mawk} (programma di utilit@`a)
 5960 @cindex programma di utilit@`a @subentry @command{mawk}
 5961 @item Tenere la barra inversa cos@`{@dotless{i}} com'@`e.
 5962 Alcune altre implementazioni di @command{awk} fanno questo.
 5963 In quelle implementazioni, immettere @code{"a\qc"} equivale a immettere
 5964 @code{"a\\qc"}.
 5965 @end table
 5966 @end sidebar
 5967 Ricapitolando:
 5968 
 5969 @itemize @value{BULLET}
 5970 @item
 5971 Le sequenze di protezione nella lista di cui sopra sono sempre elaborate
 5972 per prime, sia per le costanti stringa che per le costanti @dfn{regexp}.  Questo
 5973 viene fatto quasi subito, non appena @command{awk} legge il programma.
 5974 
 5975 @item
 5976 @command{gawk} elabora sia costanti @dfn{regexp} che @dfn{regexp} dinamiche
 5977 (@pxref{Espressioni regolari calcolate}),
 5978 per gli operatori speciali elencati in
 5979 @ref{Operatori di @dfn{regexp} GNU}.
 5980 
 5981 @item
 5982 Una barra inversa prima di ogni altro carattere richiede di trattare quel
 5983 carattere letteralmente.
 5984 @end itemize
 5985 
 5986 @sidebar Sequenze di protezione per metacaratteri
 5987 @cindex metacaratteri @subentry sequenze di protezione per
 5988 
 5989 Supponiamo che si usi una protezione ottale o esadecimale
 5990 per rappresentare un metacarattere di @dfn{regexp}
 5991 (si veda @ref{Operatori di espressioni regolari}).
 5992 @command{awk} considera il carattere come un carattere letterale o
 5993 come un operatore di @dfn{regexp}?
 5994 
 5995 @cindex angolo buio @subentry sequenze di protezione @subentry per metacaratteri
 5996 Storicamente, tali caratteri erano considerati letteralmente.
 5997 @value{DARKCORNER}
 5998 Invece, lo standard POSIX richiede che siano considerati
 5999 come metacaratteri veri e propri, e questo @`e ci@`o che @command{gawk} fa.
 6000 In modalit@`a compatibile (@pxref{Opzioni}),
 6001 @command{gawk} tratta i caratteri scritti come sequenze ottali ed esadecimali
 6002 letteramente, quando sono usati in costanti @dfn{regexp}.  Quindi,
 6003 @code{/a\52b/} equivale a @code{/a\*b/}.
 6004 @end sidebar
 6005 
 6006 @node Operatori di espressioni regolari
 6007 @section Operatori di espressioni regolari
 6008 @cindex espressioni regolari @subentry operatori
 6009 @cindex metacaratteri @subentry in espressioni regolari
 6010 
 6011 @`E possibile inserire in espressioni regolari dei caratteri speciali,
 6012 detti @dfn{operatori di espressioni regolari} o @dfn{metacaratteri}, per
 6013 aumentarne il potere e la versatilit@`a.
 6014 
 6015 @menu
 6016 * Dettagli sugli operatori di @dfn{regexp}::     Descrizione dettagliata.
 6017 * Espressioni di intervallo::                    Note sulle espressioni di intervallo.
 6018 @end menu
 6019 
 6020 @node Dettagli sugli operatori di @dfn{regexp}
 6021 @subsection Operatori di @dfn{regexp} in @command{awk}
 6022 
 6023 Le sequenze di protezione descritte
 6024 @ifnotinfo
 6025 prima
 6026 @end ifnotinfo
 6027 in @ref{Sequenze di protezione}
 6028 sono valide all'interno di una @dfn{regexp}.  Sono precedute da una @samp{\} e
 6029 sono riconosciute e convertite nei caratteri reali corrispondenti nella
 6030 primissima fase dell'elaborazione delle @dfn{regexp}.
 6031 
 6032 Ecco una lista dei metacaratteri.  Tutti i caratteri che non sono sequenze
 6033 di protezione e che non sono elencati qui rappresentano se stessi:
 6034 
 6035 @c Use @asis so the docbook comes out ok. Sigh.
 6036 @table @asis
 6037 @cindex barra inversa (@code{\}) @subentry operatore @dfn{regexp}
 6038 @cindex @code{\} (barra inversa) @subentry operatore @dfn{regexp}
 6039 @item @code{\}
 6040 Si usa per togliere il significato speciale a un carattere quando si effettuano
 6041 confronti.  Per esempio, @samp{\$}
 6042 individua il carattere @samp{$}.
 6043 
 6044 @cindex espressioni regolari @subentry @`ancore nelle
 6045 @cindex Texinfo @subentry inizi di capitolo nei file
 6046 @cindex @code{^} (circonflesso) @subentry operatore @dfn{regexp}
 6047 @cindex circonflesso (@code{^}) @subentry operatore @dfn{regexp}
 6048 @item @code{^}
 6049 Si usa per indicare l'inizio di una stringa.  Per esempio, @samp{^@@chapter}
 6050 individua @samp{@@chapter} all'inizio di una stringa e si pu@`o usare per
 6051 identificare inizi di capitoli in file sorgenti Texinfo.
 6052 Il simbolo @samp{^} @`e conosciuto come @dfn{@`ancora}, perch@'e @`ancora la ricerca
 6053 solo all'inizio della stringa.
 6054 
 6055 @`E importante notare che @samp{^} non individua un inizio di riga
 6056 (il punto subito dopo un ritorno a capo @samp{\n}) che si trovi all'interno
 6057 di una stringa.  La condizione non @`e verificata nell'esempio seguente:
 6058 
 6059 @example
 6060 if ("riga1\nRIGA 2" ~ /^R/) @dots{}
 6061 @end example
 6062 
 6063 @cindex @code{$} (dollaro) @subentry operatore @dfn{regexp}
 6064 @cindex dollaro (@code{$}) @subentry operatore @dfn{regexp}
 6065 @item @code{$}
 6066 Simile a @samp{^}, ma serve a indicare la fine di una stringa.
 6067 Per esempio, @samp{p$}
 6068 individua un record che termina con la lettera @samp{p}.  Il @samp{$} @`e
 6069 un'@`ancora e non individua una fine di riga (il punto immediatamente prima
 6070 di un carattere di ritorno a capo @samp{\n})
 6071 contenuta in una stringa.
 6072 La condizione nell'esempio seguente non @`e verificata:
 6073 
 6074 @example
 6075 if ("riga1\nRIGA 2" ~ /1$/) @dots{}
 6076 @end example
 6077 
 6078 @cindex @code{.} (punto) @subentry operatore @dfn{regexp}
 6079 @cindex punto (@code{.}) @subentry operatore @dfn{regexp}
 6080 @item @code{.} (punto)
 6081 Individua un qualsiasi carattere,
 6082 @emph{incluso} il carattere di ritorno a capo.  Per esempio, @samp{.P}
 6083 individua ogni carattere in una stringa che sia seguito da una @samp{P}.
 6084 Usando la concatenazione, si pu@`o formare un'espressione regolare come
 6085 @samp{U.A}, che individua qualsiasi sequenza di tre caratteri che inizia con
 6086 @samp{U} e finisce con @samp{A}.
 6087 
 6088 @cindex POSIX @subentry modalit@`a
 6089 @cindex modalit@`a POSIX 
 6090 @cindex POSIX @command{awk} @subentry uso del punto (@code{.})
 6091 In modalit@`a POSIX stretta (@pxref{Opzioni}),
 6092 @samp{.} non individua il carattere @sc{nul},
 6093 ossia il carattere con tutti i bit uguali a zero.
 6094 In altri contesti, @sc{nul} @`e solo un carattere qualsiasi.  Altre versioni
 6095 di @command{awk} possono non essere in grado di individuare il carattere
 6096 @sc{nul}.
 6097 
 6098 @cindex @code{[]} (parentesi quadre) @subentry operatore @dfn{regexp}
 6099 @cindex parentesi @subentry quadre (@code{[]}) @subentry operatore @dfn{regexp}
 6100 @cindex espressioni @subentry tra parentesi quadre
 6101 @cindex insiemi di caratteri (in espressioni regolari) @seeentry{espressioni tra parentesi quadre}
 6102 @cindex liste di caratteri @seeentry{espressioni tra parentesi quadre}
 6103 @cindex classi di caratteri @seeentry{espressioni tra parentesi quadre}
 6104 @item @code{[}@dots{}@code{]}
 6105 Questa @`e chiamata una @dfn{espressione tra parentesi quadre}.@footnote{In
 6106 altri testi, un'espressione tra parentesi quadre potrebbe essere
 6107 definita come @dfn{insieme di caratteri}, @dfn{classe di caratteri} o
 6108 @dfn{lista di caratteri}.}
 6109 Individua @emph{uno} qualsiasi dei caratteri racchiusi tra
 6110 parentesi quadre.  Per esempio, @samp{[MVX]} individua uno qualsiasi
 6111 dei caratteri @samp{M}, @samp{V}, o @samp{X} in una stringa.  Una spiegazione
 6112 esauriente di quel che si pu@`o mettere all'interno di un'espressione tra
 6113 parentesi quadre @`e data in
 6114 @ref{Espressioni tra parentesi quadre}.
 6115 
 6116 @cindex espressioni @subentry tra parentesi quadre @subentry complementate
 6117 @item @code{[^}@dots{}@code{]}
 6118 Questa @`e una @dfn{espressione tra parentesi quadre complementata}.  Il primo
 6119 carattere dopo la @samp{[} @emph{deve} essere un @samp{^}.  Individua
 6120 qualsiasi carattere
 6121 @emph{tranne} quelli tra parentesi quadre.  Per esempio, @samp{[^awk]}
 6122 individua qualsiasi carattere che non sia una @samp{a}, @samp{w}, o @samp{k}.
 6123 
 6124 @cindex @code{|} (barra verticale)
 6125 @cindex barra verticale (@code{|})
 6126 @item @code{|}
 6127 Questo @`e un @dfn{operatore alternativa} ed @`e usato per specificare delle
 6128 alternative.  La @samp{|} ha la precedenza pi@`u bassa tra tutti gli operatori
 6129 di espressioni regolari.  Per esempio, @samp{^P|[aeiouy]} individua tutte le
 6130 stringhe corrispondenti a @samp{^P} oppure a @samp{[aeiouy]}.  Ci@`o significa
 6131 che individua qualsiasi stringa che inizi con @samp{P} o contenga (in
 6132 qualsiasi posizione al suo interno) una vocale inglese minuscola.
 6133 
 6134 L'alternativa si applica alle @dfn{regexp} pi@`u ampie individuabili in ogni
 6135 lato.
 6136 
 6137 @cindex @code{()} (parentesi) @subentry operatore @dfn{regexp}
 6138 @cindex parentesi @subentry (@code{()}) @subentry operatore @dfn{regexp}
 6139 @item @code{(}@dots{}@code{)}
 6140 Le parentesi sono usate per raggruppare, sia nelle espressioni regolari sia
 6141 in quelle aritmetiche.  Si possono usare per concatenare espressioni regolari
 6142 che contengono l'operatore alternativa, @samp{|}.  Per esempio,
 6143 @samp{@@(samp|code)\@{[^@}]+\@}} individua sia @samp{@@code@{pippo@}} sia
 6144 @samp{@@samp@{pluto@}}.
 6145 (Queste sono sequenze in linguaggio Texinfo per controllare la formattazione.
 6146 Il significato di @samp{+} @`e
 6147 spiegato pi@`u avanti in questa lista.)
 6148 
 6149 La parentesi sinistra (di apertura) @`e sempre un metacarattere;
 6150 per cercare una corrispondenza letterale con una tale parentesi,
 6151 occorre farla precedere da una barra inversa.  Comunque, la
 6152 parentesi destra (di chiusura), @`e speciale solo se eesiste la
 6153 relativa parentesi sinistra; una parentesi destra senza la
 6154 corrispondente parentesi sinistra @`e considerata (senza dare
 6155 alcun messaggio di avviso) come un normale carattere.
 6156 
 6157 @cindex @code{*} (asterisco) @subentry operatore @code{*} @subentry come operatore @dfn{regexp}
 6158 @cindex asterisco (@code{*}) @subentry operatore @code{*} @subentry come operatore @dfn{regexp}
 6159 @item @code{*}
 6160 Questo simbolo richiede che la precedente espressione regolare sia
 6161 ripetuta tante volte quanto serve per trovare una corrispondenza.  Per
 6162 esempio, @samp{ph*} applica il simbolo
 6163 @samp{*} al carattere @samp{h} che lo precede immediatamente e ricerca
 6164 corrispondenze costituite da una @samp{p} seguita da un numero qualsiasi di
 6165 @samp{h}.  Viene individuata anche solo la @samp{p}, se non ci sono
 6166 @samp{h}.
 6167 
 6168 Ci sono due sfumature da capire sul funzionamento di @samp{*}.
 6169 Primo, @samp{*} tiene conto solo del singolo componente dell'espressione
 6170 regolare che lo precede (p.es., in @samp{ph*} vale solo per @samp{h}).
 6171 Per fare s@`{@dotless{i}} che @samp{*} si applichi a una sottoespressione pi@`u estesa,
 6172 occorre metterla tra parentesi:
 6173 @samp{(ph)*} individua @samp{ph}, @samp{phph}, @samp{phphph} e cos@`{@dotless{i}} via.
 6174 
 6175 Secondo, @samp{*} trova quante pi@`u ripetizioni siano possibili.  Se il testo
 6176 da ricercare @`e @samp{phhhhhhhhhhhhhhooey}, @samp{ph*} individua tutte le
 6177 @samp{h}.
 6178 
 6179 @cindex @code{+} (pi@`u) @subentry operatore @dfn{regexp}
 6180 @cindex pi@`u (@code{+}) @subentry operatore @dfn{regexp}
 6181 @item @code{+}
 6182 Questo simbolo @`e simile a @samp{*}, tranne per il fatto che l'espressione
 6183 precedente deve essere trovata almeno una volta.  Questo significa che
 6184 @samp{wh+y} individuerebbe @samp{why} e @samp{whhy}, ma non @samp{wy}, mentre
 6185 @samp{wh*y} li troverebbe tutti e tre.
 6186 
 6187 @cindex @code{?} (punto interrogativo) @subentry operatore @dfn{regexp}
 6188 @cindex punto interrogativo (@code{?}) @subentry operatore @dfn{regexp}
 6189 @item @code{?}
 6190 Questo simbolo @`e simile a @samp{*}, tranne per il fatto che l'espressione che
 6191 precede pu@`o essere trovata una volta sola oppure non trovata
 6192 affatto.  Per esempio, @samp{fe?d}
 6193 individua @samp{fed} e @samp{fd}, ma nient'altro.
 6194 
 6195 @cindex @code{@{@}} (parentesi graffe) @subentry operatore @dfn{regexp}
 6196 @cindex parentesi @subentry graffe (@code{@{@}}) @subentry operatore @dfn{regexp}
 6197 @cindex espressioni @subentry di intervallo @subentry (@dfn{regexp})
 6198 @item @code{@{}@var{n}@code{@}}
 6199 @itemx @code{@{}@var{n}@code{,@}}
 6200 @itemx @code{@{}@var{n}@code{,}@var{m}@code{@}}
 6201 Uno o due numeri tra parentesi graffe rappresentano una
 6202 @dfn{espressione di intervallo}.
 6203 Se c'@`e un numero tra graffe, la @dfn{regexp} precedente @`e ripetuta
 6204 @var{n} volte.
 6205 Se ci sono due numeri separati da una virgola, la @dfn{regexp} precedente @`e
 6206 ripetuta da @var{n} a @var{m} volte.
 6207 Se c'@`e un numero seguito da una virgola, allora la @dfn{regexp} precedente
 6208 @`e ripetuta almeno @var{n} volte:
 6209 
 6210 @table @code
 6211 @item wh@{3@}y
 6212 Riconosce @samp{whhhy}, ma non @samp{why} o @samp{whhhhy}.
 6213 
 6214 @item wh@{3,5@}y
 6215 Riconosce soltanto @samp{whhhy}, @samp{whhhhy}, o @samp{whhhhhy}.
 6216 
 6217 @item wh@{2,@}y
 6218 Riconosce @samp{whhy}, @samp{whhhy} e cos@`{@dotless{i}} via.
 6219 @end table
 6220 @end table
 6221 
 6222 @cindex precedenza @subentry operatori @dfn{regexp}
 6223 @cindex espressioni regolari @subentry operatori @subentry precedenza degli
 6224 Nelle espressioni regolari, gli operatori @samp{*}, @samp{+}, e @samp{?},
 6225 come pure le parentesi graffe @samp{@{} e @samp{@}},
 6226 hanno
 6227 la precedenza pi@`u alta, seguite dalla concatenazione, e poi da
 6228 @samp{|}.
 6229 Come nell'algebra, le parentesi possono cambiare il raggruppamento degli
 6230 operatori.
 6231 
 6232 @cindex POSIX @command{awk} @subentry espressioni regolari
 6233 @cindex @command{gawk} @subentry espressioni regolari @subentry precedenza
 6234 In POSIX @command{awk} e @command{gawk}, gli operatori @samp{*}, @samp{+}
 6235 e @samp{?} rappresentano se stessi quando non c'@`e nulla prima di essi
 6236 nella @dfn{regexp}.  Per esempio, @code{/+/} individua un semplice segno
 6237 pi@`u.  Tuttavia, molte altre versioni di @command{awk} trattano una
 6238 tale notazione come un errore di sintassi.
 6239 
 6240 @node Espressioni di intervallo
 6241 @subsection Alcune note sulle espressioni di intervallo
 6242 
 6243 @cindex POSIX @command{awk} @subentry espressioni di intervallo
 6244 Le espressioni di intervallo non erano tradizionalmente disponibili in
 6245 @command{awk}.  Sono state aggiunte come parte dello standard POSIX per
 6246 rendere @command{awk} ed @command{egrep} coerenti tra di loro.
 6247 
 6248 @cindex @command{gawk} @subentry espressioni di intervallo e
 6249 In passato, poich@'e vecchi programmi possono usare @samp{@{} e @samp{@}} in
 6250 costanti @dfn{regexp},
 6251 @command{gawk} @emph{non} riconosceva espressioni di intervallo
 6252 nelle @dfn{regexp}.
 6253 
 6254 Comunque, a partire dalla @value{PVERSION} 4.0,
 6255 @command{gawk} riconosce espressioni di intervallo per default.
 6256 Ci@`o accade perch@'e la compatibilit@`a con POSIX @`e ritenuta pi@`u
 6257 importante da molti utenti @command{gawk} rispetto alla compatibilit@`a con
 6258 dei vecchi programmi.
 6259 
 6260 Per programmi che usano @samp{@{} e @samp{@}} in costanti @dfn{regexp},
 6261 @`e buona pratica proteggerli sempre con una barra inversa.  Allora le
 6262 costanti @dfn{regexp} sono valide e si comportano come desiderato, usando
 6263 qualsiasi versione di @command{awk}.@footnote{@`E meglio usare due barre inverse
 6264 se si sta usando una costante stringa con un operatore @dfn{regexp} o una
 6265 funzione.}
 6266 
 6267 Infine, quando @samp{@{} e @samp{@}} appaiono in costanti @dfn{regexp}
 6268 in un modo non interpretabile come espressione di intervallo
 6269 (come in @code{/q@{a@}/}), allora sono prese letteralmente.
 6270 
 6271 Come detto sopra, le espressioni di intervallo non erano tradizionalmente
 6272 disponibili in @command{awk}.  Con la versione di Marzo 2019 di
 6273 BWK @command{awk} sono (finalmente) disponibili.
 6274 
 6275 Ciononostante, non essendo state disponibili per parecchi decenni,
 6276 @command{gawk} continua a non renderle disponibili quando viene
 6277 eseguito in modalit@`a compatibile (@pxref{Opzioni}).
 6278 
 6279 @node Espressioni tra parentesi quadre
 6280 @section Usare espressioni tra parentesi quadre
 6281 @cindex espressioni @subentry tra parentesi quadre
 6282 @cindex espressioni @subentry tra parentesi quadre @subentry espressioni di intervallo
 6283 @cindex espressioni @subentry di intervallo @subentry (@dfn{regexp})
 6284 @cindex elenchi di caratteri in espressioni regolari
 6285 @cindex caratteri @subentry elenchi di, in espressioni regolari
 6286 @cindex espressioni regolari @subentry elenchi di caratteri in
 6287 
 6288 Come detto sopra, un'espressione tra parentesi quadre individua qualsiasi
 6289 carattere incluso tra le parentesi quadre aperta e chiusa.
 6290 
 6291 All'interno di un'espressione tra parentesi quadre, una
 6292 @dfn{espressione di intervallo} @`e formata da due caratteri separati da un
 6293 trattino.  Individua ogni singolo carattere compreso tra i due caratteri,
 6294 ordinati secondo l'insieme di caratteri in uso nel sistema.  Per esempio,
 6295 @samp{[0-9]} equivale a @samp{[0123456789]}.
 6296 (Si veda @ref{Intervalli e localizzazione} per una spiegazione di come
 6297 lo standard POSIX e @command{gawk} sono cambiati nel corso degli anni.
 6298 La cosa ha un interesse principalmente storico.)
 6299 
 6300 Con la crescente popolarit@`a dello
 6301 @uref{http://www.unicode.org, standard di caratteri Unicode},
 6302 c'@`e un'ulteriore dettaglio da tenere in conto. Le sequenze di
 6303 protezione ottali ed esadecimali utilizzabili per inserire
 6304 valori all'interno di espressioni tra parentesi quadre
 6305 sono considerate contenere solo caratteri
 6306 che occupano un unico byte (caratteri il cui valore stia
 6307 nell'intervallo 0--256).  Per individuare un intervallo di
 6308 caratteri in cui i punti di inizio e fine dell'intervello
 6309 abbiano valori maggiori di 256, occorre immettere direttamente
 6310 le codifiche multi-byte dei caratteri in questione.
 6311 
 6312 @cindex @code{\} (barra inversa) @subentry in espressioni tra parentesi quadre
 6313 @cindex barra inversa (@code{\}) @subentry in espressioni tra parentesi quadre
 6314 @cindex @code{^} (circonflesso) @subentry in espressioni tra parentesi quadre
 6315 @cindex circonflesso (@code{^}) @subentry in espressioni tra parentesi quadre
 6316 @cindex @code{-} (meno) @subentry in espressioni tra parentesi quadre
 6317 @cindex meno (@code{-}) @subentry in espressioni tra parentesi quadre
 6318 Per includere uno dei caratteri @samp{\}, @samp{]}, @samp{-}, o @samp{^} in
 6319 un'espressione tra parentesi quadre, occorre inserire un @samp{\} prima del
 6320 carattere stesso.  Per esempio:
 6321 
 6322 @example
 6323 [d\]]
 6324 @end example
 6325 
 6326 @noindent
 6327 individua sia @samp{d} che @samp{]}.
 6328 Inoltre, se si mette una @samp{]} subito dopo la
 6329 @samp{[} aperta, la parentesi quadra chiusa @`e considerata come uno dei
 6330 caratteri da individuare.
 6331 
 6332 @cindex POSIX @command{awk} @subentry espressioni tra parentesi quadre
 6333 @cindex espressioni regolari @subentry estese (ERE)
 6334 @cindex ERE (espressioni regolari estese)
 6335 @cindex @command{egrep} (programma di utilit@`a)
 6336 @cindex programma di utilit@`a @subentry @command{egrep}
 6337 L'utilizzo di @samp{\} nelle espressioni tra parentesi quadre
 6338 @`e compatibile con altre implementazioni di @command{awk} ed @`e anche richiesto
 6339 da POSIX.
 6340 Le espressioni regolari in @command{awk} sono un insieme pi@`u esteso delle
 6341 specificazioni POSIX per le espressioni regolari estese (ERE).
 6342 Le ERE POSIX sono basate sulle espressioni regolari accettate dal
 6343 tradizionale programma di utilit@`a @command{egrep}.
 6344 
 6345 @cindex espressioni @subentry tra parentesi quadre @subentry classi di caratteri
 6346 @cindex POSIX @command{awk} @subentry espressioni tra parentesi quadre @subentry classi di caratteri
 6347 Le @dfn{classi di caratteri} sono una funzionalit@`a introdotta nello standard
 6348 POSIX.  Una classe di caratteri @`e una particolare notazione per descrivere
 6349 liste di caratteri cha hanno un attributo specifico, ma i caratteri
 6350 veri e propri possono variare da paese a paese e/o
 6351 da insieme di caratteri a insieme di caratteri.  Per esempio, la nozione di
 6352 cosa sia un carattere alfabetico @`e diversa tra gli Stati Uniti e la Francia.
 6353 
 6354 Una classe di caratteri @`e valida solo in una @dfn{regexp} @emph{contenuta}
 6355 tra le parentesi quadre di un'espressione tra parentesi quadre.  Le classi di
 6356 caratteri consistono di @samp{[:},
 6357 una parola chiave che segnala la classe, e @samp{:]}.  La
 6358 @ref{tabella-caratteri-classe} elenca le classi di caratteri definite dallo
 6359 standard POSIX.
 6360 
 6361 @float Tabella,tabella-caratteri-classe
 6362 @caption{classi di caratteri POSIX}
 6363 @multitable @columnfractions .15 .85
 6364 @headitem Classe @tab Significato
 6365 @item @code{[:alnum:]} @tab Caratteri alfanumerici.
 6366 @item @code{[:alpha:]} @tab Caratteri alfabetici.
 6367 @item @code{[:blank:]} @tab Caratteri spazio e TAB.
 6368 @item @code{[:cntrl:]} @tab Caratteri di controllo.
 6369 @item @code{[:digit:]} @tab Caratteri numerici.
 6370 @item @code{[:graph:]} @tab Caratteri che sono stampabili e visibili.
 6371 (Uno @dfn{spazio} @`e stampabile ma non visibile, mentre una @samp{a} @`e l'uno e
 6372 l'altro.)
 6373 @item @code{[:lower:]} @tab Caratteri alfabetici minuscoli.
 6374 @item @code{[:print:]} @tab Caratteri stampabili (caratteri che non sono
 6375 caratteri di controllo).
 6376 @item @code{[:punct:]} @tab Caratteri di punteggiatura (caratteri che non
 6377 sono lettere, cifre, caratteri di controllo, o caratteri di spazio).
 6378 @item @code{[:space:]} @tab Caratteri di spazio (ovvero: @dfn{spazio}, TAB, avanzamento riga (@dfn{newline}), ritorno a capo (@dfn{carriage return}), avanzamento pagina (@dfn{formfeed}) e tabulazione verticale)
 6379 @item @code{[:upper:]} @tab Caratteri alfabetici maiuscoli.
 6380 @item @code{[:xdigit:]} @tab Caratteri che sono cifre esadecimali.
 6381 @end multitable
 6382 @end float
 6383 
 6384 Per esempio, prima dello standard POSIX, si doveva scrivere
 6385 @code{/[A-Za-z0-9]/} per individuare i
 6386 caratteri alfanumerici.  Se l'insieme
 6387 di caratteri in uso comprendeva altri caratteri alfabetici, l'espressione
 6388 non li avrebbe individuati.
 6389 Con le classi di caratteri POSIX si pu@`o scrivere
 6390 @code{/[[:alnum:]]/} per designare i caratteri alfabetici e numerici
 6391 dell'insieme di caratteri in uso.
 6392 
 6393 @ignore
 6394 From eliz@gnu.org  Fri Feb 15 03:38:41 2019
 6395 Date: Fri, 15 Feb 2019 12:38:23 +0200
 6396 From: Eli Zaretskii <eliz@gnu.org>
 6397 To: arnold@skeeve.com
 6398 CC: pengyu.ut@gmail.com, bug-gawk@gnu.org
 6399 Subject: Re: [bug-gawk] Does gawk character classes follow this?
 6400 
 6401 > From: arnold@skeeve.com
 6402 > Date: Fri, 15 Feb 2019 03:01:34 -0700
 6403 > Cc: pengyu.ut@gmail.com, bug-gawk@gnu.org
 6404 >
 6405 > I get the feeling that there's something really bothering you, but
 6406 > I don't understand what.
 6407 >
 6408 > Can you clarify, please?
 6409 
 6410 I thought I already did: we cannot be expected to provide a definitive
 6411 description of what the named classes stand for, because the answer
 6412 depends on various factors out of our control.
 6413 @end ignore
 6414 
 6415 @c Thanks to
 6416 @c Date: Tue, 01 Jul 2014 07:39:51 +0200
 6417 @c From: Hermann Peifer <peifer@gmx.eu>
 6418 @cindex ASCII
 6419 Alcuni programmi di utilit@`a che cercano espressioni regolari prevedono
 6420 una classe di caratteri, non standard,
 6421 @samp{[:ascii:]}; @command{awk} non la prevede.  Tuttavia, @`e possibile ottenere
 6422 lo stesso risultato utilizzando @samp{[\x00-\x7F]}.  Quest'espressione
 6423 individua tutti i valori numerici tra zero e 127, che @`e l'intervallo definito
 6424 dell'insieme di caratteri ASCII.  Usando una lista di caratteri che esclude
 6425 (@samp{[^\x00-\x7F]}) si individuano tutti i caratteri mono-byte che non
 6426 sono nell'intervallo ASCII.
 6427 
 6428 @quotation NOTA
 6429 Alcune vecchie versioni Unix di @command{awk}
 6430 trattano @code{[:blank:]} come @code{[:space:]}, individuando quindi
 6431 pi@`u caratteri del dovuto.  Caveat Emptor! [Stia in guardia il compratore!].
 6432 @end quotation
 6433 
 6434 @cindex espressioni @subentry tra parentesi quadre @subentry elementi di collazione
 6435 @cindex espressioni @subentry tra parentesi quadre @subentry non-ASCII
 6436 @cindex elementi @subentry di collazione
 6437 In espressioni tra parentesi quadre possono apparire due ulteriori sequenze
 6438 speciali.  Riguardano insiemi di caratteri non-ASCII, che possono avere
 6439 simboli singoli (chiamati @dfn{elementi di collazione}) che sono rappresentati
 6440 con pi@`u di un carattere.  Possono designare anche parecchi caratteri che sono
 6441 equivalenti tra loro ai fini della @dfn{collazione}, o dell'ordinamento.
 6442 (Per esempio, in francese, la semplice ``e'' e la sua versione con accento grave ``@`e''
 6443 sono equivalenti).  Queste sequenze sono:
 6444 
 6445 @table @asis
 6446 @cindex espressioni @subentry tra parentesi quadre @subentry elementi di collazione
 6447 @cindex elementi @subentry di collazione
 6448 @item elementi di collazione
 6449 Elementi di collazione multi-byte racchiusi fra
 6450 @samp{[.} e @samp{.]}.  Per esempio, se @samp{ch} @`e un elemento di collazione,
 6451 @samp{[[.ch.]]} @`e una @dfn{regexp} che individua questo elemento di
 6452 collazione, mentre @samp{[ch]} @`e una @dfn{regexp} che individua le lettere
 6453 @samp{c} o @samp{h}.
 6454 
 6455 @cindex espressioni @subentry tra parentesi quadre @subentry classi di equivalenza
 6456 @item classi di equivalenza
 6457 Sono nomi, specifici a una particolare localizzazione, per una lista di
 6458 caratteri equivalenti tra loro.  Il nome @`e racchiuso fra
 6459 @samp{[=} e @samp{=]}.
 6460 Per esempio, il nome @samp{e} potrebbe essere usato per designare
 6461 ``e'', ``@^e'', ``@`e'', e ``@'e''. In questo caso, @samp{[[=e=]]} @`e una @dfn{regexp}
 6462 che corrisponde a @samp{e}, @samp{@^e}, @samp{@`e} e @samp{@'e}.
 6463 @end table
 6464 
 6465 Queste funzionalit@`a sono molto utili in localizzazioni non inglesi.
 6466 
 6467 @cindex internazionalizzazione @subentry localizzazione @subentry classi di caratteri
 6468 @cindex @command{gawk} @subentry classi di caratteri e
 6469 @cindex POSIX @command{awk} @subentry espressioni tra parentesi quadre @subentry classi di caratteri
 6470 @quotation ATTENZIONE
 6471 Le funzioni di libreria che @command{gawk} usa per individuare le espressioni
 6472 regolari per ora riconoscono solo le classi di caratteri POSIX;
 6473 non riconoscono simboli di collazione o classi di equivalenza.
 6474 @end quotation
 6475 @c maybe one day ...
 6476 
 6477 In un'espressione tra parentesi quadre, una parentesi aperta (@samp{[})
 6478 che non costituisca l'inizio della specificazione di una classe di
 6479 caratteri, di simboli di collazione o di una classe di equivalenza
 6480 @`e interpretata letteralmente.  Questo vale anche per @samp{.} e @samp{*}.
 6481 
 6482 @node Pi@`u lungo da sinistra
 6483 @section Quanto @`e lungo il testo individuato?
 6484 
 6485 @cindex espressioni regolari @subentry corrispondenza pi@`u a sinistra
 6486 @c @cindex matching, leftmost longest
 6487 Si consideri il caso seguente:
 6488 
 6489 @example
 6490 echo aaaabcd | awk '@{ sub(/a+/, "<A>"); print @}'
 6491 @end example
 6492 
 6493 Questo esempio usa la funzione @code{sub()} per modificare il record in input.
 6494 (@code{sub()} sostituisce la prima ricorrenza in ogni testo individuato dal
 6495 primo argomento con la stringa fornita come secondo argomento;
 6496 @pxref{Funzioni per stringhe}.)  Qui, la @dfn{regexp} @code{/a+/} richiede
 6497 ``uno o pi@`u caratteri @samp{a},'' e il testo da sostituire @`e @samp{<A>}.
 6498 
 6499 L'input contiene quattro caratteri @samp{a}.
 6500 Le espressioni regolari @command{awk} (e POSIX) individuano sempre
 6501 la sequenza @emph{pi@`u lunga}, partendo da sinistra, di caratteri in input che
 6502 corrispondono.  Quindi, tutti e quattro i caratteri @samp{a} sono
 6503 rimpiazzati con @samp{<A>} in questo esempio:
 6504 
 6505 @example
 6506 $ @kbd{echo aaaabcd | awk '@{ sub(/a+/, "<A>"); print @}'}
 6507 @print{} <A>bcd
 6508 @end example
 6509 
 6510 Per semplici test corrisponde/non corrisponde, la cosa ha poca importanza.
 6511 Ma se si sta controllando un testo o si fanno sostituzioni usando le funzioni
 6512 @code{match()}, @code{sub()}, @code{gsub()} e @code{gensub()},
 6513 @`e invece molto importante.
 6514 @ifinfo
 6515 @xref{Funzioni per stringhe},
 6516 Per maggiori informazioni su queste funzioni.
 6517 @end ifinfo
 6518 Tenere in conto questo principio @`e importante anche quando si suddividono
 6519 record e campi usando delle @dfn{regexp} (@pxref{Record},
 6520 e anche @pxref{Separatori di campo}).
 6521 
 6522 @node Espressioni regolari calcolate
 6523 @section Usare @dfn{regexp} dinamiche
 6524 
 6525 @cindex espressioni regolari @subentry calcolate
 6526 @cindex espressioni regolari @subentry dinamiche
 6527 @cindex @code{~} (tilde) @subentry operatore @code{~}
 6528 @cindex tilde (@code{~}) @subentry operatore @code{~}
 6529 @cindex @code{!} (punto esclamativo) @subentry operatore @code{!~}
 6530 @cindex punto esclamativo (@code{!}) @subentry operatore @code{!~}
 6531 @c @cindex operators, @code{~}
 6532 @c @cindex operators, @code{!~}
 6533 L'espressione a destra di un operatore @samp{~} o @samp{!~} non deve
 6534 necessariamente essere una costante @dfn{regexp} (cio@`e, una stringa di
 6535 caratteri tra barre).  Pu@`o essere una qualsiasi
 6536 espressione.  L'espressione @`e valutata e convertita in una stringa
 6537 se necessario; il contenuto della stringa @`e poi usato come una @dfn{regexp}.
 6538 Una @dfn{regexp} calcolata in questo modo @`e detta una @dfn{regexp dinamica}
 6539 o una @dfn{regexp calcolata}:
 6540 
 6541 @example
 6542 BEGIN @{ @dfn{regexp}_numerica = "[[:digit:]]+" @}
 6543 $0 ~ @dfn{regexp}_numerica    @{ print @}
 6544 @end example
 6545 
 6546 @noindent
 6547 Questo @dfn{script} imposta @code{regexp_numerica} come una @dfn{regexp} che
 6548 descrive una o pi@`u cifre, e poi controlla se un record in input corrisponde a
 6549 questa regexp.
 6550 
 6551 @quotation NOTA
 6552 Usando gli operatori @samp{~} e @samp{!~}, si tenga presente che c'@`e
 6553 una differenza tra una costante @dfn{regexp} racchiusa tra barre e una
 6554 costante stringa racchiusa tra doppi apici.
 6555 Se si intende utilizzare una costante stringa, occorre comprendere che
 6556 la stringa @`e, in sostanza, scandita @emph{due volte}: la prima volta quando
 6557 @command{awk} legge il programma, e la seconda volta quando va a
 6558 confrontare la stringa a sinistra dell'operatore con il modello che sta
 6559 alla sua destra.  Questo vale per ogni espressione (come la
 6560 @code{regexp_numerica}, vista nel precedente esempio), non solo per le
 6561 costanti stringa.
 6562 @end quotation
 6563 
 6564 @cindex costanti @subentry @dfn{regexp} @subentry barre vs.@: doppi apici
 6565 @cindex @code{\} (barra inversa) @subentry in costanti @dfn{regexp}
 6566 @cindex barra inversa (@code{\}) @subentry in costanti @dfn{regexp}
 6567 @cindex @code{"} (doppio apice) @subentry in costanti @dfn{regexp}
 6568 @cindex doppio apice (@code{"}) @subentry in costanti @dfn{regexp}
 6569 Che differenza fa la doppia scansione di una stringa?
 6570 La risposta ha a che vedere con le sequenze di protezione e particolarmente
 6571 con le barre inverse.  Per inserire una barra inversa in un'espressione
 6572 regolare all'interno di una stringa, occorre inserire @emph{due} barre
 6573 inverse.
 6574 
 6575 Per esempio, @code{/\*/} @`e una costante @dfn{regexp} per designare un @samp{*}
 6576 letterale.
 6577 @`E richiesta una sola barra inversa.  Per fare lo stesso con una stringa,
 6578 occorre immettere @code{"\\*"}.  La prima barra inversa protegge la
 6579 seconda in modo che la stringa in realt@`a contenga i
 6580 due caratteri @samp{\} e @samp{*}.
 6581 
 6582 @cindex risoluzione di problemi @subentry costanti @dfn{regexp} vs.@: costanti stringa
 6583 @cindex problemi @subentry risoluzione di @subentry costanti @dfn{regexp} vs.@: costanti stringa
 6584 @cindex costanti @subentry @dfn{regexp} @subentry vs.@: costanti stringa
 6585 @cindex costanti @subentry stringa @subentry vs.@: costanti @dfn{regexp}
 6586 Dato che si possono usare sia costanti @dfn{regexp} che costanti stringa per
 6587 descrivere espressioni regolari, qual @`e da preferire?  La risposta @`e
 6588 ``costanti @dfn{regexp}'', per molti motivi:
 6589 
 6590 @itemize @value{BULLET}
 6591 @item
 6592 Le costanti stringa sono pi@`u complicate da scrivere e pi@`u difficili
 6593 da leggere.  Usare costanti @dfn{regexp} rende i programmi
 6594 meno inclini all'errore.  Non comprendere la differenza tra i due tipi di
 6595 costanti @`e una fonte frequente di errori.
 6596 
 6597 @item
 6598 @`E pi@`u efficiente usare costanti @dfn{regexp}. @command{awk} pu@`o accorgersi
 6599 che @`e stata fornita una @dfn{regexp} e memorizzarla internamente in una forma
 6600 che rende la ricerca di corrispondenze pi@`u efficiente.  Se si usa una costante
 6601 stringa, @command{awk} deve prima convertire la stringa nel suo formato
 6602 interno e quindi eseguire la ricerca di corrispondenze.
 6603 
 6604 @item
 6605 Usare costanti @dfn{regexp} @`e la forma migliore; lascia comprendere
 6606 chiaramente che si vuole una corrispondenza con una @dfn{regexp}.
 6607 @end itemize
 6608 
 6609 @sidebar Usare @code{\n} in espressioni tra parentesi quadre in @dfn{regexp} dinamiche
 6610 @cindex espressioni regolari @subentry dinamiche @subentry contenenti dei ritorni a capo
 6611 @cindex ritorno a capo @subentry in @dfn{regexp} dinamiche
 6612 
 6613 Alcune delle prime versioni di @command{awk} non consentono di usare il
 6614 carattere di ritorno a capo
 6615 all'interno di un'espressione tra parentesi quadre in @dfn{regexp}
 6616 dinamiche:
 6617 
 6618 @example
 6619 $ @kbd{awk '$0 ~ "[ \t\n]"'}
 6620 @error{} awk: newline in character class [
 6621 @error{} ]...
 6622 @error{}  source line number 1
 6623 @error{}  context is
 6624 @error{}        $0 ~ "[ >>>  \t\n]" <<<
 6625 @end example
 6626 
 6627 @cindex ritorno a capo @subentry in costanti @dfn{regexp}
 6628 Ma un ritorno a capo in una costante @dfn{regexp} non d@`a alcun problema:
 6629 
 6630 @example
 6631 $ @kbd{awk '$0 ~ /[ \t\n]/'}
 6632 @kbd{ecco una riga di esempio}
 6633 @print{} ecco una riga di esempio
 6634 @kbd{Ctrl-d}
 6635 @end example
 6636 
 6637 @command{gawk} non ha questo problema, e non dovrebbe accadere spesso
 6638 in pratica, ma val la pena di notarlo a futura memoria.
 6639 @end sidebar
 6640 
 6641 @node Operatori di @dfn{regexp} GNU
 6642 @section Operatori @dfn{regexp} propri di @command{gawk}
 6643 
 6644 @c This section adapted (long ago) from the regex-0.12 manual
 6645 
 6646 @cindex espressioni regolari @subentry operatori @subentry @command{gawk}
 6647 @cindex @command{gawk} @subentry espressioni regolari @subentry operatori
 6648 @cindex operatori @subentry specifici per GNU
 6649 @cindex espressioni regolari @subentry operatori @subentry per parole
 6650 @cindex parola @subentry definizione in @dfn{regexp}
 6651 Il software GNU che ha a che fare con espressioni regolari comprende alcuni
 6652 operatori @dfn{regexp} aggiuntivi.  Questi
 6653 operatori sono descritti in
 6654 @ifnotinfo
 6655 questa
 6656 @end ifnotinfo
 6657 @ifinfo
 6658 questo
 6659 @end ifinfo
 6660 @value{SECTION} e sono specificamente
 6661 per @command{gawk}; non sono disponibili in altre implementazioni di
 6662 @command{awk}.
 6663 La maggior parte degli operatori aggiuntivi riguarda l'identificazione di
 6664 parole.  Ai nostri fini, una @dfn{parola} @`e una sequenza di uno o pi@`u lettere,
 6665 cifre, o trattini bassi (@samp{_}):
 6666 
 6667 @table @code
 6668 @c @cindex operators, @code{\s} (@command{gawk})
 6669 @cindex barra inversa (@code{\}) @subentry @code{\s} (operatore @command{gawk})
 6670 @cindex @code{\} (barra inversa) @subentry @code{\s} (operatore @command{gawk})
 6671 @item \s
 6672 Corrisponde a ogni carattere bianco,
 6673 come definito nella localizzazione corrente.
 6674 Lo si pu@`o pensare come un'abbreviazione di
 6675 @w{@samp{[[:space:]]}}.
 6676 
 6677 @c @cindex operators, @code{\S} (@command{gawk})
 6678 @cindex barra inversa (@code{\}) @subentry @code{\S} (operatore @command{gawk})
 6679 @cindex @code{\} (barra inversa) @subentry @code{\S} (operatore @command{gawk})
 6680 @item \S
 6681 Corrisponde a ogni carattere che non @`e uno spazio bianco,
 6682 come definito nella localizzazione corrente.
 6683 Lo si pu@`o pensare come un'abbreviazione di
 6684 @w{@samp{[^[:space:]]}}.
 6685 
 6686 @c @cindex operators, @code{\w} (@command{gawk})
 6687 @cindex barra inversa (@code{\}) @subentry @code{\w} (operatore @command{gawk})
 6688 @cindex @code{\} (barra inversa) @subentry @code{\w} (operatore @command{gawk})
 6689 @item \w
 6690 Corrisponde a ogni carattere che componga una parola; ovvero, corrisponde a
 6691 ogni lettera, cifra, o trattino basso.
 6692 Lo si pu@`o pensare come un'abbreviazione di
 6693 @w{@samp{[[:alnum:]_]}}.
 6694 
 6695 @c @cindex operators, @code{\W} (@command{gawk})
 6696 @cindex barra inversa (@code{\}) @subentry @code{\W} (operatore @command{gawk})
 6697 @cindex @code{\} (barra inversa) @subentry @code{\W} (operatore @command{gawk})
 6698 @item \W
 6699 Corrisponde a ogni carattere che non @`e parte di una parola.
 6700 Lo si pu@`o pensare come un'abbreviazione di
 6701 @w{@samp{[^[:alnum:]_]}}.
 6702 
 6703 @c @cindex operators, @code{\<} (@command{gawk})
 6704 @cindex barra inversa (@code{\}) @subentry @code{\<} (operatore @command{gawk})
 6705 @cindex @code{\} (barra inversa) @subentry @code{\<} (operatore @command{gawk})
 6706 @item \<
 6707 Individua la stringa nulla all'inizio di una parola.
 6708 Per esempio, @code{/\<via/} individua @samp{via} ma non
 6709 @samp{funivia}.
 6710 
 6711 @c @cindex operators, @code{\>} (@command{gawk})
 6712 @cindex barra inversa (@code{\}) @subentry @code{\>} (operatore @command{gawk})
 6713 @cindex @code{\} (barra inversa) @subentry @code{\>} (operatore @command{gawk})
 6714 @item \>
 6715 Individua la stringa nulla alla fine di una parola.
 6716 Per esempio, @code{/via\>/} individua @samp{via} ma non @samp{viadotto}.
 6717 
 6718 @c @cindex operators, @code{\y} (@command{gawk})
 6719 @cindex barra inversa (@code{\}) @subentry @code{\y} (operatore @command{gawk})
 6720 @cindex @code{\} (barra inversa) @subentry @code{\y} (operatore @command{gawk})
 6721 @cindex limite-di-parola @subentry individuare il
 6722 @item \y
 6723 Individua la stringa nulla o alla fine o all'inizio di una parola.
 6724 (cio@`e, il limite di una parola - @dfn{boundar@strong{y}} in inglese).
 6725 Per esempio, @samp{\yradar?\y}
 6726 individua sia @samp{rada} che @samp{radar}, come parole separate.
 6727 
 6728 @c @cindex operators, @code{\B} (@command{gawk})
 6729 @cindex barra inversa (@code{\}) @subentry @code{\B} (operatore @command{gawk})
 6730 @cindex @code{\} (barra inversa) @subentry @code{\B} (operatore @command{gawk})
 6731 @item \B
 6732 Individua la stringa nulla che ricorre all'interno di una parola.
 6733 Per esempio,
 6734 @code{/\Bora\B/} individua @samp{Colorado}, ma non individua @samp{che ora @`e}.
 6735 @samp{\B} @`e essenzialmente l'opposto di @samp{\y}.
 6736 @end table
 6737 
 6738 @cindex buffer @subentry operatori per
 6739 @cindex espressioni regolari @subentry operatori @subentry per buffer
 6740 @cindex operatori @subentry ricerca in stringhe @subentry per buffer
 6741 Ci sono due altri operatori che operano sui buffer.  In Emacs un
 6742 @dfn{buffer} @`e, naturalmente, un buffer di Emacs.  In altri programmi GNU,
 6743 fra cui @command{gawk}, le routine di libreria delle @dfn{regexp} considerano
 6744 come buffer l'intera stringa su cui effettuare il confronto.
 6745 Gli operatori sono:
 6746 
 6747 @table @code
 6748 @item \`
 6749 @c @cindex operators, @code{\`} (@command{gawk})
 6750 @cindex barra inversa (@code{\}) @subentry @code{\`} (operatore @command{gawk})
 6751 @cindex @code{\} (barra inversa) @subentry @code{\`} (operatore @command{gawk})
 6752 Individua la stringa nulla che occorre all'inizio di un buffer
 6753 (di una stringa)
 6754 
 6755 @c @cindex operators, @code{\'} (@command{gawk})
 6756 @cindex barra inversa (@code{\}) @subentry @code{\'} (operatore @command{gawk})
 6757 @cindex @code{\} (barra inversa) @subentry @code{\'} (operatore @command{gawk})
 6758 @item \'
 6759 Individua la stringa nulla che occorre alla fine di un buffer
 6760 (di una stringa)
 6761 @end table
 6762 
 6763 @cindex @code{^} (circonflesso) @subentry operatore @dfn{regexp}
 6764 @cindex circonflesso (@code{^}) @subentry operatore @dfn{regexp}
 6765 @cindex @code{?} (punto interrogativo) @subentry operatore @dfn{regexp}
 6766 @cindex punto interrogativo (@code{?}) @subentry operatore @dfn{regexp}
 6767 Poich@'e @samp{^} e @samp{$} si riferiscono sempre all'inizio e alla
 6768 fine di stringhe, questi operatori non aggiungono nuove funzionalit@`a
 6769 ad @command{awk}.  Sono inclusi per compatibilit@`a con altro
 6770 software GNU.
 6771 
 6772 @cindex @command{gawk} @subentry operatore limite-di-parola
 6773 @cindex limite-di-parola @subentry operatore (@command{gawk})
 6774 @cindex operatori @subentry limite-di-parola (@command{gawk})
 6775 In altro software GNU, l'operatore di limite-di-parola @`e @samp{\b}.  Questo,
 6776 comunque, @`e in conflitto con la definizione, nel linguaggio @command{awk},
 6777 di @samp{\b} come
 6778 backspace, quindi @command{gawk} usa una lettera differente.
 6779 Un metodo alternativo sarebbe stato di richiedere due barre inverse negli
 6780 operatori GNU, ma questo @`e stato ritenuto troppo arzigogolato.  Il metodo
 6781 corrente di usare @samp{\y} al posto del @samp{\b} di GNU sembra essere
 6782 il male minore.
 6783 
 6784 @cindex espressioni regolari @subentry @command{gawk} @subentry opzioni sulla riga di comando
 6785 @cindex @command{gawk} @subentry opzioni sulla riga di comando @subentry ed espressioni regolari
 6786 Le varie opzioni sulla riga di comando
 6787 (@pxref{Opzioni})
 6788 controllano come @command{gawk} interpreta i caratteri nelle @dfn{regexp}:
 6789 
 6790 @table @asis
 6791 @item Nessuna opzione
 6792 Per default, @command{gawk} fornisce tutte le funzionalit@`a delle
 6793 regexp POSIX e gli
 6794 operatori @dfn{regexp} GNU
 6795 @ifnotinfo
 6796 predecentemente descritti.
 6797 @end ifnotinfo
 6798 @ifnottex
 6799 @ifnotdocbook
 6800 Sono descritti
 6801 in @ref{Operatori di espressioni regolari}.
 6802 @end ifnotdocbook
 6803 @end ifnottex
 6804 
 6805 @item @code{--posix}
 6806 Sono ammesse solo le @dfn{regexp} POSIX; gli operatori GNU non sono
 6807 speciali (p.es., @samp{\w} individua una semplice lettera @samp{w}).
 6808 Le espressioni di intervallo sono ammesse.
 6809 
 6810 @cindex Brian Kernighan @subentry @command{awk} di
 6811 @item @code{--traditional}
 6812 Le @dfn{regexp} Unix tradizionali di @command{awk} sono ammesse.  Gli
 6813 operatori GNU non sono speciali, e le espressioni
 6814 di intervallo non sono ammesse.
 6815 Le classi di caratteri POSIX (@samp{[[:alnum:]]}, etc.) sono ammesse,
 6816 poich@'e BWK @command{awk} le prevede.
 6817 I caratteri descritti usando sequenze di protezione ottali ed esadecimali sono
 6818 trattati letteralmente, anche se rappresentano metacaratteri di @dfn{regexp}.
 6819 
 6820 @item @code{--re-interval}
 6821 Sono consentite espressioni di intervallo in @dfn{regexp},
 6822 se @option{--traditional} @`e stata specificata.
 6823 Altrimenti, le espressioni di intervallo sono disponibili per default.
 6824 @end table
 6825 
 6826 @node Maiuscolo-Minuscolo
 6827 @section Fare confronti ignorando maiuscolo/minuscolo
 6828 
 6829 @cindex espressioni regolari @subentry maiuscolo/minuscolo
 6830 @cindex @dfn{regexp} @subentry maiuscolo/minuscolo
 6831 @cindex maiuscolo/minuscolo @subentry @dfn{regexp} e
 6832 Il tipo di carattere (maiuscolo/minuscolo) @`e normalmente rilevante nelle
 6833 espressioni regolari, sia nella ricerca di
 6834 caratteri normali (cio@`e, non metacaratteri), sia all'interno di espressioni
 6835 fra parentesi.  Quindi, una @samp{w} in un'espressione regolare individua
 6836 solo una @samp{w} e non la corrispondente maiuscola @samp{W}.
 6837 
 6838 Il modo pi@`u semplice per richiedere una ricerca non sensibile al
 6839 maiuscolo/minuscolo @`e di usare un'espressione tra parentesi quadre, per
 6840 esempio @samp{[Ww]}.  Comunque, questo pu@`o essere pesante se si usa spesso,
 6841 e pu@`o rendere le espressioni regolari di difficile lettura.
 6842 Ci sono due alternative che potrebbero essere preferibili.
 6843 
 6844 Un modo per fare un confronto non sensibile a maiuscolo/minuscolo in un
 6845 particolare punto del programma
 6846 @`e di convertire i dati in un solo tipo (o minuscole o maiuscole),
 6847 usando le funzioni di stringa
 6848 predefinite @code{tolower()} o @code{toupper()} (che non
 6849 abbiamo ancora introdotto;
 6850 @pxref{Funzioni per stringhe}).
 6851 Per esempio:
 6852 
 6853 @example
 6854 tolower($1) ~ /foo/  @{ @dots{} @}
 6855 @end example
 6856 
 6857 @noindent
 6858 converte il primo campo in minuscole, prima di fare un confronto.
 6859 Questo funziona in ogni @command{awk} conforme allo standard POSIX.
 6860 
 6861 @cindex @command{gawk} @subentry espressioni regolari @subentry distinzione maiuscolo/minuscolo
 6862 @cindex distinzione maiuscolo/minuscolo @subentry @command{gawk}
 6863 @cindex differenze tra @command{awk} e @command{gawk} @subentry espressioni regolari
 6864 @cindex @code{~} (tilde) @subentry operatore @code{~}
 6865 @cindex tilde (@code{~}) @subentry operatore @code{~}
 6866 @cindex @code{!} (punto esclamativo) @subentry operatore @code{!~}
 6867 @cindex punto esclamativo (@code{!}) @subentry operatore @code{!~}
 6868 @cindex @code{IGNORECASE} (variabile) @subentry con operatori @code{~} e @code{!~}
 6869 @cindex @command{gawk} @subentry variabile @subentry @code{IGNORECASE} in
 6870 @c @cindex variables, @code{IGNORECASE}
 6871 Un altro metodo, proprio di @command{gawk}, @`e di impostare la variabile
 6872 @code{IGNORECASE} a un valore diverso da zero (@pxref{Variabili predefinite}).
 6873 Quando @code{IGNORECASE} @`e diverso da zero, @emph{tutte} le operazioni con
 6874 regexp e stringhe ignorano la distinzione maiuscolo/minuscolo.
 6875 
 6876 Il cambio del valore di @code{IGNORECASE} controlla dinamicamente la
 6877 sensibilit@`a a maiuscolo/minuscolo del programma quando @`e in esecuzione.
 6878 Il tipo di carattere (maiuscolo/minuscolo) @`e rilevante per default,
 6879 poich@'e @code{IGNORECASE} (come la maggior parte delle variabili) @`e
 6880 inizializzata a zero:
 6881 
 6882 @example
 6883 x = "aB"
 6884 if (x ~ /ab/) @dots{}   # questo test non risulter@`a verificato
 6885 
 6886 IGNORECASE = 1
 6887 if (x ~ /ab/) @dots{}   # adesso sar@`a verificato
 6888 @end example
 6889 
 6890 In generale, non @`e possibile usare @code{IGNORECASE} per rendere certe regole
 6891 non sensibili a maiuscolo/minuscolo e altre regole invece s@`{@dotless{i}}, perch@'e non c'@`e
 6892 una maniera diretta per impostare
 6893 @code{IGNORECASE} solo per l'espressione di
 6894 una particolare regola.@footnote{Programmatori esperti in C e C++ noteranno
 6895 che questo @`e possible, usando qualcosa come
 6896 @samp{IGNORECASE = 1 && /foObAr/ @{ @dots{} @}}
 6897 e
 6898 @samp{IGNORECASE = 0 || /foobar/ @{ @dots{} @}}.
 6899 Comunque, questo @`e un po' tortuoso e non @`e raccomandato.}
 6900 Per fare questo, si usino espressioni tra parentesi quadre oppure
 6901 @code{tolower()}.  Comunque, una cosa che si pu@`o fare con @code{IGNORECASE}
 6902 soltanto @`e di utilizzare o di ignorare la sensibilit@`a a maiuscolo/minuscolo
 6903 per tutte le regole contemporaneamente.
 6904 
 6905 @code{IGNORECASE} @`e impostabile dalla riga di comando o in una regola
 6906 @code{BEGIN} (@pxref{Altri argomenti}; e
 6907 @pxref{Usare BEGIN/END}).
 6908 Impostare @code{IGNORECASE} dalla riga di comando @`e un modo per rendere
 6909 un programma insensibile a maiuscolo/minuscolo senza doverlo modificare.
 6910 
 6911 @c @cindex ISO 8859-1
 6912 @c @cindex ISO Latin-1
 6913 In localizzazioni multibyte, le equivalenze tra caratteri maiuscoli
 6914 e minuscoli sono controllate usando i valori in formato esteso
 6915 dell'insieme di caratteri della localizzazione.
 6916 Prima della @value{PVERSION} 5.0, i caratteri che usano un solo byte
 6917 erano confrontati usando l'insieme di caratteri ISO-8859-1 (ISO Latin-1).
 6918 Tuttavia, a partire dalla @value{PVERSION} 5.0, i caratteri che usano
 6919 un solo byte sono confrontati usando anche i valori dell'insieme di
 6920 caratteri della localizzazione.@footnote{Se questo sembra oscuro,
 6921 non c'@`e ragione di preoccuparsi; significa solo che @command{gawk} fa
 6922 la cosa giusta.}
 6923 
 6924 Il valore di @code{IGNORECASE} non ha effetto se @command{gawk} @`e in
 6925 modalit@`a compatibile (@pxref{Opzioni}).
 6926 Il tipo di carattere (maiuscolo o minuscolo) @`e sempre rilevante in modalit@`a
 6927 compatibile.
 6928 
 6929 @node Sommario espressioni regolari
 6930 @section Sommario
 6931 
 6932 @itemize @value{BULLET}
 6933 @item
 6934 Le espressioni regolari descrivono insiemi di stringhe da confrontare.
 6935 In @command{awk}, le costanti @dfn{regexp} sono scritte racchiuse
 6936 fra barre: @code{/}@dots{}@code{/}.
 6937 
 6938 @item
 6939 Le costanti @dfn{regexp} possono essere usate da sole in modelli di ricerca e
 6940 in espressioni condizionali, o come parte di espressioni di ricerca
 6941 usando gli operatori @samp{~} e @samp{!~}.
 6942 
 6943 @item
 6944 Le sequenze di protezione consentono di rappresentare caratteri non stampabili
 6945 e consentono anche di rappresentare metacaratteri @dfn{regexp} come caratteri
 6946 letterali per i quali cercare corrispondenze.
 6947 
 6948 @item
 6949 Gli operatori @dfn{regexp} consentono raggruppamento, alternativa e
 6950 ripetizione.
 6951 
 6952 @item
 6953 Le espressioni tra parentesi quadre sono delle notazioni abbreviate per
 6954 specificare insiemi di caratteri che possono avere corrispondenze in un
 6955 punto particolare di una @dfn{regexp}.
 6956 All'interno di espressioni tra parentesi quadre, le classi di caratteri POSIX
 6957 consentono di specificare certi gruppi di caratteri in maniera indipendente
 6958 dalla localizzazione.
 6959 
 6960 @item
 6961 Le espressioni regolari individuano il testo pi@`u lungo possibile, a partire
 6962 da sinistra nella stringa in esame.  Questo ha importanza nei casi in cui
 6963 serve conoscere la lunghezza della corrispondenza, come nella sostituzione di
 6964 testo e quando il separatore di record sia una @dfn{regexp}.
 6965 
 6966 @item
 6967 Espressioni di ricerca possono usare @dfn{regexp} dinamiche, ossia, i valori
 6968 delle stringhe sono considerato come espressioni regolari.
 6969 
 6970 @item
 6971 La variabile @command{gawk} @code{IGNORECASE} consente di controllare la
 6972 differenza maiuscolo/minuscolo nel confronto mediante @dfn{regexp}.  In altre
 6973 versioni di @command{awk}, vanno usate invece le funzioni @code{tolower()} o
 6974 @code{toupper()}.
 6975 
 6976 @end itemize
 6977 
 6978 @node Leggere file
 6979 @chapter Leggere file in input
 6980 
 6981 @cindex leggere @subentry file in input
 6982 @cindex input @subentry leggere
 6983 @cindex input
 6984 @cindex @code{FILENAME} (variabile)
 6985 @cindex variabile @subentry @code{FILENAME}
 6986 Nel tipico programma @command{awk},
 6987 @command{awk} legge tutto l'input sia dallo standard input
 6988 (per default @`e la tastiera, ma spesso @`e una @dfn{pipe} da un altro comando)
 6989 o da file i cui nomi vengono specificati sulla riga di comando di
 6990 @command{awk}.  Se si specificano file in input, @command{awk} li legge
 6991 nell'ordine, elaborando tutti i dati di uno prima di passare al successivo.
 6992 Il nome del file in input corrente si trova nella variabile predefinita
 6993 @code{FILENAME}
 6994 (@pxref{Variabili predefinite}).
 6995 
 6996 @cindex record
 6997 @cindex campi
 6998 L'input @`e letto in unit@`a chiamate @dfn{record}, e viene elaborato, secondo le
 6999 regole del programma, un record alla volta.
 7000 Per default, ogni record @`e una riga.  Ogni
 7001 record @`e suddiviso automaticamente in "pezzi" chiamati @dfn{campi}.
 7002 Questo rende pi@`u pratico far lavorare i programmi sulle parti di un record.
 7003 
 7004 @cindex @code{getline} (comando)
 7005 In rare occasioni, si potrebbe aver bisogno di usare il comando
 7006 @code{getline}. Il comando  @code{getline} @`e utile sia perch@'e pu@`o procurare
 7007 un input esplicito da un numero indeterminato di file, sia perch@'e non vanno
 7008 specificati sulla riga di comando di @command{awk} i nomi dei file usati con
 7009 getline (@pxref{Getline}).
 7010 
 7011 @menu
 7012 * Record::                           Controllare come i dati sono suddivisi
 7013                                      in record.
 7014 * Campi::                            Un'introduzione ai campi.
 7015 * Campi non costanti::               Numeri di campo variabili.
 7016 * Cambiare i campi::                 Cambiare il contenuto di un campo.
 7017 * Separatori di campo::              I separatori di campo, e come
 7018                                      cambiarli.
 7019 * Dimensione costante::              Leggere campi di larghezza costante.
 7020 * Separazione in base al contenuto:: Definire campi dal loro contenuto.
 7021 * Controllare la creazione di campi:: Controllare come @command{gawk} sta
 7022                                      dividendo i record.
 7023 * Righe multiple::                   Leggere record che sono su pi@`u righe.
 7024 * Getline::                          Leggere file sotto il controllo del
 7025                                      programma, usando la funzione
 7026                                      @code{getline}.
 7027 * Timeout in lettura::               Leggere input entro un tempo limite.
 7028 * Proseguire dopo errore in input::  Elaborare ulteriore input dopo certi
 7029                                      errori di I/O.
 7030 * Directory su riga di comando::     Cosa succede mettendo una directory
 7031                                      sulla riga di comando.
 7032 * Sommario di Input::                Sommario di Input.
 7033 * Esercizi su Input::                Esercizi.
 7034 @end menu
 7035 
 7036 @node Record
 7037 @section Controllare come i dati sono suddivisi in record
 7038 
 7039 @cindex input @subentry suddividere in record
 7040 @cindex record @subentry suddividere l'input in
 7041 @cindex @code{NR} (variabile)
 7042 @cindex @code{FNR} (variabile)
 7043 @command{awk} suddivide l'input per il programma in record e campi.
 7044 Tiene traccia del numero di record gi@`a letti dal
 7045 file in input corrente.  Questo valore @`e memorizzato in una variabile
 7046 predefinita chiamata @code{FNR} che @`e reimpostata a zero ogni volta che si
 7047 inizia un nuovo file.  Un'altra variabile predefinita, @code{NR}, registra il
 7048 numero totale di record in input gi@`a letti da tutti i @value{DF}.
 7049 Il suo valore iniziale @`e zero ma non viene mai reimpostata a zero
 7050 automaticamente.
 7051 
 7052 I record sono normalmente separati dal carattere di avanzamento riga
 7053 (@dfn{newline}).  @`E possibile specificare come vanno separati i record
 7054 assegnando un valore alla variabile predefinita @code{RS}.
 7055 Se il valore di @code{RS} @`e costituto da un solo carattere, @`e quello
 7056 il carattere che fa da separatore fra i record.
 7057 Altrimenti (in @command{gawk}), @code{RS} @`e valutata come espressione
 7058 regolare.  Questo meccanismo @`e spiegato pi@`u in dettaglio qui sotto.
 7059 
 7060 @menu
 7061 * awk divisione record::       Come @command{awk} standard divide i record.
 7062 * gawk divisione record::      Come @command{gawk} divide i record.
 7063 @end menu
 7064 
 7065 @node awk divisione record
 7066 @subsection Come @command{awk} standard divide i record.
 7067 
 7068 @cindex separatore di record
 7069 @cindex record @subentry separatore di
 7070 I record sono separati da un carattere chiamato @dfn{separatore di record}.
 7071 Per default, il separatore di record @`e il carattere di ritorno a capo.
 7072 Questo @`e il motivo per cui i record sono, per default, righe singole.
 7073 Per usare un diverso carattere come separatore di record
 7074 basta assegnare quel carattere alla variabile predefinita @code{RS}.
 7075 
 7076 @cindex separatore di record @subentry ritorno a capo come
 7077 @cindex ritorno a capo @subentry come separatore di record
 7078 @cindex ritorno a capo @subentry come separatore di record
 7079 @cindex @code{RS} (variabile)
 7080 Come per ogni altra variabile,
 7081 il valore di @code{RS} pu@`o essere cambiato nel programma @command{awk}
 7082 con l'operatore di assegnamento, @samp{=}
 7083 (@pxref{Operatori di assegnamento}).
 7084 Il nuovo separatore di record dovrebbe essere racchiuso tra doppi apici,
 7085 per indicare una costante di stringa.  Spesso il momento giusto per far questo
 7086 @`e all'inizio dell'esecuzione, prima che sia elaborato qualsiasi input,
 7087 in modo che il primo record sia letto col separatore appropriato.
 7088 Per far ci@`o, si usa il criterio speciale @code{BEGIN}
 7089 (@pxref{BEGIN/END}).
 7090 Per esempio:
 7091 
 7092 @example
 7093 awk 'BEGIN @{ RS = "u" @}
 7094      @{ print $0 @}' mail-list
 7095 @end example
 7096 
 7097 @noindent
 7098 cambia il valore di @code{RS} in @samp{u}, prima di leggere qualsiasi input.
 7099 Il nuovo valore @`e una stringa il cui primo carattere @`e la lettera ``u''; come
 7100 risultato, i record sono separati dalla lettera ``u''.  Poi viene letto il
 7101 file in input, e la seconda regola nel programma @command{awk} (l'azione
 7102 eseguita se non si specifica un criterio)
 7103 stampa ogni record.  Poich@'e ogni istruzione @code{print} aggiunge
 7104 un ritorno a capo alla fine del suo output, questo programma
 7105 @command{awk} copia l'input con ogni @samp{u} trasformato in un
 7106 ritorno a capo.
 7107 Qui vediamo il risultato dell'esecuzione del programma sul file
 7108 @file{mail-list}:
 7109 
 7110 @example
 7111 @group
 7112 $ @kbd{awk 'BEGIN @{ RS = "u" @}}
 7113 >      @kbd{@{ print $0 @}' mail-list}
 7114 @end group
 7115 @print{} Amelia       555-5553     amelia.zodiac
 7116 @print{} sq
 7117 @print{} e@@gmail.com    F
 7118 @print{} Anthony      555-3412     anthony.assert
 7119 @print{} ro@@hotmail.com   A
 7120 @print{} Becky        555-7685     becky.algebrar
 7121 @print{} m@@gmail.com      A
 7122 @print{} Bill         555-1675     bill.drowning@@hotmail.com       A
 7123 @print{} Broderick    555-0542     broderick.aliq
 7124 @print{} otiens@@yahoo.com R
 7125 @print{} Camilla      555-2912     camilla.inf
 7126 @print{} sar
 7127 @print{} m@@skynet.be     R
 7128 @print{} Fabi
 7129 @print{} s       555-1234     fabi
 7130 @print{} s.
 7131 @print{} ndevicesim
 7132 @print{} s@@
 7133 @print{} cb.ed
 7134 @print{}     F
 7135 @print{} J
 7136 @print{} lie        555-6699     j
 7137 @print{} lie.perscr
 7138 @print{} tabor@@skeeve.com   F
 7139 @print{} Martin       555-6480     martin.codicib
 7140 @print{} s@@hotmail.com    A
 7141 @print{} Sam
 7142 @print{} el       555-3430     sam
 7143 @print{} el.lanceolis@@sh
 7144 @print{} .ed
 7145 @print{}         A
 7146 @print{} Jean-Pa
 7147 @print{} l    555-2127     jeanpa
 7148 @print{} l.campanor
 7149 @print{} m@@ny
 7150 @print{} .ed
 7151 @print{}      R
 7152 @print{}
 7153 @end example
 7154 
 7155 @noindent
 7156 Si noti che la voce relativa al nome @samp{Bill} non @`e divisa.
 7157 Nel @value{DF} originale
 7158 (@pxref{File dati di esempio}),
 7159 la riga appare in questo modo:
 7160 
 7161 @example
 7162 Bill         555-1675     bill.drowning@@hotmail.com       A
 7163 @end example
 7164 
 7165 @noindent
 7166 Essa non contiene nessuna @samp{u}, per cui non c'@`e alcun motivo di dividere
 7167 il record, diversamente dalle altre, che hanno una o pi@`u ricorrenze della
 7168 @samp{u}. Infatti, questo record @`e trattato come parte del record precedente;
 7169 il ritorno a capo che li separa nell'output @`e l'originale ritorno a capo nel
 7170 @value{DF}, non quella aggiunta da @command{awk} quando ha stampato il record!
 7171 
 7172 @cindex separatore di record @subentry cambiare il
 7173 @cindex cambiare @subentry il separatore di record
 7174 @cindex record @subentry separatore di
 7175 Un altro modo per cambiare il separatore di record @`e sulla riga di comando,
 7176 usando la funzionalit@`a dell'assegnamento di variabile
 7177 (@pxref{Altri argomenti}):
 7178 
 7179 @example
 7180 awk '@{ print $0 @}' RS="u" mail-list
 7181 @end example
 7182 
 7183 @noindent
 7184 Questo imposta @code{RS} a @samp{u} prima di elaborare @file{mail-list}.
 7185 
 7186 Usando un carattere alfabetico come @samp{u} come separatore di record
 7187 @`e molto probabile che si ottengano risultati strani.
 7188 Usando un carattere insolito come @samp{/} @`e pi@`u probabile
 7189 che si ottenga un comportamento corretto nella  maggioranza dei casi, ma non
 7190 c'@`e nessuna garanzia.  La morale @`e: conosci i tuoi dati!
 7191 
 7192 @command{gawk} consente di usare per @code{RS} un'espressione regolare
 7193 normale (descritta pi@`u avanti; @pxref{gawk divisione record}).
 7194 Tuttavia, se l'espressione regolare @`e costituita da un singolo metacarattere,
 7195 come p.es. @samp{.} che assegni il valore di @code{RS}, il metacarattere
 7196 in questione non viene trattato come tale, ma viene usato letteralmente.
 7197 Ci@`o viene fatto per compatibilit@`a all'indietro sia con il comando
 7198 Unix @command{awk} che con lo standard POSIX.
 7199 
 7200 Quando si usano caratteri normali come separatore di record,
 7201 c'@`e un caso insolito che capita quando @command{gawk}
 7202 @`e reso completamente conforme a POSIX (@pxref{Opzioni}).
 7203 In quel caso, la seguente (estrema) @dfn{pipeline} stampa un sorprendente
 7204 @samp{1}:
 7205 
 7206 @example
 7207 $ echo | gawk --posix 'BEGIN @{ RS = "a" @} ; @{ print NF @}'
 7208 @print{} 1
 7209 @end example
 7210 
 7211 C'@`e un solo campo, consistente in un ritorno a capo.  Il valore della
 7212 variabile predefinita @code{NF} @`e il numero di campi nel record corrente.
 7213 (Normalmente @command{gawk} tratta il ritorno a capo come uno spazio
 7214 vuoto, stampando @samp{0} come risultato.  Anche molte altre versioni di
 7215 @command{awk} agiscono in questo modo.)
 7216 
 7217 @cindex angolo buio @subentry file in input
 7218 Il raggiungimento della fine di un file in input fa terminare il record di
 7219 input corrente, anche se l'ultimo carattere nel file non @`e il carattere in
 7220 @code{RS}.  @value{DARKCORNER}
 7221 
 7222 @cindex stringa @subentry vuota @seeentry{stringa nulla}
 7223 @cindex stringa nulla
 7224 @cindex stringa @subentry vuota @seeentry{stringa nulla}
 7225 La stringa nulla @code{""} (una stringa che non contiene alcun carattere)
 7226 ha un significato particolare come
 7227 valore di @code{RS}.  Significa che i record sono separati
 7228 soltanto da una o pi@`u righe vuote.
 7229 @xref{Righe multiple} per maggiori dettagli.
 7230 
 7231 Se si cambia il valore di @code{RS} nel mezzo di un'esecuzione di
 7232 @command{awk}, il nuovo valore @`e usato per delimitare i record successivi, ma
 7233 non riguarda il record in corso di elaborazione e neppure quelli gi@`a
 7234 elaborati.
 7235 
 7236 @cindex @command{gawk} @subentry variabile @subentry @code{RT} in
 7237 @cindex @code{RT} (variabile)
 7238 @cindex record @subentry fine dei
 7239 @cindex differenze tra @command{awk} e @command{gawk} @subentry separatore di record
 7240 @cindex differenze tra @command{awk} e @command{gawk} @subentry variabili @code{RS}/@code{RT}
 7241 @cindex espressioni regolari @subentry come separatore di record
 7242 @cindex record @subentry separatore di @subentry espressioni regolari come
 7243 @cindex separatore di record @subentry espressioni regolari come
 7244 Dopo che @`e stata determinata la fine di un record, @command{gawk}
 7245 imposta la variabile @code{RT} al testo nell'input che corrisponde a
 7246 @code{RS}.
 7247 
 7248 @node gawk divisione record
 7249 @subsection Divisione dei record con @command{gawk}
 7250 
 7251 @cindex estensioni comuni @subentry @code{RS} come espressione regolare
 7252 @cindex comuni @subentry estensioni @subentry @code{RS} come espressione regolare
 7253 Quando si usa @command{gawk},
 7254 il valore di @code{RS} non @`e limitato a una stringa costituita da un solo
 7255 carattere.  Se contiene pi@`u di un carattere, @`e considerato essere
 7256 un'espressione regolare
 7257 @iftex
 7258 (@pxrefil{Espressioni regolari}). @value{COMMONEXT}
 7259 @end iftex
 7260 @ifnottex
 7261 (@pxref{Espressioni regolari}). @value{COMMONEXT}
 7262 @end ifnottex
 7263 In generale, ogni record termina alla stringa pi@`u vicina che corrisponde
 7264 all'espressione regolare; il record successivo inizia alla fine della stringa
 7265 che corrisponde.  Questa regola generale @`e in realt@`a applicata anche nel caso
 7266 normale, in cui @code{RS} contiene solo un ritorno a capo: un record
 7267 termina all'inizio della prossima stringa che corrisponde (il prossimo
 7268 ritorno a capo nell'input), e il record seguente inizia subito dopo la
 7269 fine di questa stringa (al primo carattere della riga seguente).
 7270 Il ritorno a capo, poich@'e corrisponde a @code{RS}, non appartiene a
 7271 nessuno dei due record.
 7272 
 7273 Quando @code{RS} @`e un singolo carattere, @code{RT}
 7274 contiene lo stesso singolo carattere.  Peraltro, quando @code{RS} @`e
 7275 un'espressione regolare, @code{RT} contiene l'effettivo testo in input
 7276 corrispondente all'espressione regolare.
 7277 
 7278 Se il file in input termina senza che vi sia un testo che corrisponda a
 7279 @code{RS}, @command{gawk} imposta @code{RT} alla stringa nulla.
 7280 
 7281 Il seguente esempio illustra entrambe queste caratteristiche.
 7282 In quest'esempio @code{RS} @`e impostato a un'espressione regolare che
 7283 cerca sia un ritorno a capo che una serie di una o pi@`u lettere
 7284 maiuscole con uno spazio vuoto opzionale iniziale e/o finale:
 7285 
 7286 @example
 7287 @group
 7288 $ @kbd{echo record 1 AAAA record 2 BBBB record 3 |}
 7289 > @kbd{gawk 'BEGIN @{ RS = "\n|( *[[:upper:]]+ *)" @}}
 7290 >             @kbd{@{ print "Record =", $0,"e RT = [" RT "]" @}'}
 7291 @end group
 7292 @print{} Record = record 1 e RT = [ AAAA ]
 7293 @print{} Record = record 2 e RT = [ BBBB ]
 7294 @print{} Record = record 3 e RT = [
 7295 @print{} ]
 7296 @end example
 7297 
 7298 @noindent
 7299 Le parentesi quadre racchiudono il contenuto di @code{RT}, rendendo visibile
 7300 lo spazio vuoto iniziale e quello finale.  L'ultimo valore di
 7301 @code{RT} @`e un ritorno a capo.
 7302 @xref{Programma sed semplice} per un esempio pi@`u utile
 7303 su @code{RS} come espressione regolare e su @code{RT}.
 7304 
 7305 Se si imposta @code{RS} a un'espressione regolare che consente del testo
 7306 finale opzionale, come @samp{RS = "abc(XYZ)?"} @`e possibile, per via di
 7307 limitazioni dell'implementazione, che @command{gawk} possa trovare la parte
 7308 iniziale dell'espressione regolare, ma non la parte finale, in modo
 7309 particolare se il testo di input che potrebbe avere una corrispondenza con la
 7310 parte finale @`e piuttosto lungo.  @command{gawk} cerca di evitare questo
 7311 problema, ma al momento non ci sono garanzie che questo funzioni sempre.
 7312 
 7313 @quotation NOTA
 7314 Si ricordi che in @command{awk}, i metacaratteri di ancoraggio @samp{^} e
 7315 @samp{$} trovano l'inizio e la fine di una @emph{stringa}, e non l'inizio e la
 7316 fine di una @emph{riga}.  Come risultato, qualcosa come
 7317 @samp{RS = "^[[:upper:]]"} pu@`o  solo corrispondere all'inizio di un file.
 7318 Questo perch@'e @command{gawk} vede il file in input come un'unica lunga stringa
 7319 in cui possono essere presenti dei caratteri di ritorno a capo.
 7320 @`E meglio perci@`o evitare metacaratteri di ancoraggio nel valore di @code{RS}.
 7321 @end quotation
 7322 
 7323 @cindex @command{gawk} @subentry variabile @subentry @code{RT} in
 7324 @cindex @code{RT} (variabile)
 7325 @cindex variabile @subentry @code{RT}
 7326 @cindex differenze tra @command{awk} e @command{gawk} @subentry variabili @code{RS}/@code{RT}
 7327 L'uso di @code{RS} come espressione regolare e la variabile @code{RT} sono
 7328 estensioni @command{gawk}; non sono disponibili in
 7329 modalit@`a compatibile
 7330 (@pxref{Opzioni}).
 7331 In modalit@`a compatibile, solo il primo carattere del valore di
 7332 @code{RS} determina la fine del record.
 7333 
 7334 @cindex Brian Kernighan @subentry @command{awk} di
 7335 @command{mawk} ha permesso che @code{RS} fosse un'espressione regolare
 7336 da decenni. A partire dall'ottobre 2019, anche BWK @command{awk} lo permette.
 7337 Nessuna delle due versioni, tuttavia, fornisce @code{RT}.
 7338 
 7339 @sidebar @code{RS = "\0"} non @`e portabile
 7340 @cindex portabilit@`a @subentry file di dati come un unico record
 7341 Ci sono casi in cui capita di dover trattare un intero @value{DF} come
 7342 un record unico.  L'unico modo di far questo @`e quello di dare a @code{RS}
 7343 un valore che non ricorre nel file in input.  Ci@`o @`e difficile da fare in modo
 7344 generale, cos@`{@dotless{i}} che un programma possa
 7345 funzionare con file in input arbitrari.
 7346 
 7347 Si potrebbe pensare che per i file di testo il carattere @sc{NUL}, che
 7348 consiste di un carattere con tutti i bit uguali a zero, sia un buon valore da
 7349 usare per @code{RS} in questo caso:
 7350 
 7351 @example
 7352 BEGIN @{ RS = "\0" @}  # l'intero file diventa un record?
 7353 @end example
 7354 
 7355 @cindex differenze tra @command{awk} e @command{gawk} @subentry memorizzazione di stringhe
 7356 @command{gawk} di fatto lo accetta, e usa il carattere @sc{NUL}
 7357 come separatore di record.
 7358 Questo funziona per certi file speciali, come @file{/proc/environ} su sistemi
 7359 GNU/Linux, dove il carattere @sc{NUL} @`e di fatto un separatore di record..
 7360 Comunque, quest'uso @emph{non} @`e portabile sulla maggior parte delle
 7361 implementazioni di @command{awk}.
 7362 
 7363 @cindex angolo buio @subentry stringhe, memorizzazine di
 7364 Quasi tutte le altre implementazioni di @command{awk} @footnote{Almeno quelle
 7365 che ci sono note.} memorizzano internamente le stringhe come stringhe
 7366 in stile C.  Le stringhe in stile C usano il carattere @sc{NUL} come
 7367 terminatore di stringa.  In effetti, questo significa che
 7368 @samp{RS = "\0"} @`e lo stesso di @samp{RS = ""}.
 7369 @value{DARKCORNER}
 7370 
 7371 Capita che recenti versioni di @command{mawk} possano usare i carattere
 7372 @sc{NUL} come separatore di record.  Comunque questo @`e un caso particolare:
 7373 @command{mawk} non consente  di includere caratteri @sc{NUL} nelle stringhe.
 7374 (Ci@`o potrebbe cambiare in una versione futura di @command{mawk}.)
 7375 
 7376 @cindex record @subentry trattare file come un solo
 7377 @cindex trattare un file come un solo record
 7378 @cindex file @subentry trattato come un solo record
 7379 @cindex record unico @subentry trattare file come un solo
 7380 @cindex unico record @subentry trattare un file come un
 7381 @xref{Funzione readfile} per un modo interessante di leggere
 7382 file interi.  Se si usa  @command{gawk}, si veda
 7383 @ref{Esempio di estensione Readfile} per un'altra opzione.
 7384 @end sidebar
 7385 
 7386 @node Campi
 7387 @section Un'introduzione ai campi
 7388 
 7389 @cindex esaminare i campi
 7390 @cindex campi
 7391 @cindex accesso ai campi
 7392 @cindex campi @subentry esame dei
 7393 @cindex spazio bianco @subentry definizione di
 7394 Quando @command{awk} legge un record in input, il record @`e
 7395 automaticamente @dfn{analizzato} o separato da @command{awk} in "pezzi"
 7396 chiamati @dfn{campi}.  Per default, i campi sono separati da
 7397 @dfn{spazi vuoti}, come le parole in una riga stampata.
 7398 Uno spazio vuoto in @command{awk} @`e qualsiasi stringa composta da uno o pi@`u
 7399 spazi, segni di tabulazione o ritorni a capo;
 7400 altri caratteri, come interruzione di pagina, tabulazione verticale, etc., che
 7401 sono considerati spazi vuoti in altri linguaggi, @emph{non} sono considerati
 7402 tali da @command{awk}.
 7403 
 7404 Lo scopo dei campi @`e quello di rendere pi@`u conveniente per l'utente far
 7405 riferimento a questi frammenti dei record.  Non @`e  necessario usarli --- si pu@`o
 7406 operare sull'intero record, se si vuole --- ma i campi sono ci@`o che rende
 7407 cos@`{@dotless{i}} potenti dei semplici programmi @command{awk}.
 7408 
 7409 @cindex operatore @subentry di campo @subentry @code{$}
 7410 @cindex @code{$} (dollaro) @subentry operatore di campo @code{$}
 7411 @cindex dollaro (@code{$}) @subentry operatore di campo @code{$}
 7412 @cindex operatore @subentry di campo @subentry dollaro come
 7413 Si usa il simbolo del dollaro (@samp{$})
 7414 per far riferimento a un campo in un programma @command{awk},
 7415 seguito dal numero del campo desiderato.  Quindi, @code{$1}
 7416 si riferisce al primo campo, @code{$2} al secondo, e cos@`{@dotless{i}} via.
 7417 (Diversamente che nelle shell Unix, i numeri di campo non sono limitati a una
 7418 sola cifra; @code{$127} @`e il centoventisettesimo campo nel record.)
 7419 Per esempio, supponiamo che la seguente sia una riga in input:
 7420 
 7421 @example
 7422 Questo pare essere un esempio proprio carino.
 7423 @end example
 7424 
 7425 @noindent
 7426 Qui il primo campo, o @code{$1}, @`e @samp{Questo}, il secondo campo, o
 7427 @code{$2}, @`e @samp{pare}, e via dicendo.  Si noti che l'ultimo campo,
 7428 @code{$7}, @`e @samp{carino.}.  Poich@'e non ci sono spazi tra la
 7429 @samp{o} e il @samp{.}, il punto @`e considerato parte del settimo
 7430 campo.
 7431 
 7432 @cindex @code{NF} (variabile)
 7433 @cindex campi @subentry numero dei
 7434 @code{NF} @`e una variabile predefinita il cui valore @`e il numero di campi nel
 7435 record corrente.  @command{awk} aggiorna automaticamente il valore di
 7436 @code{NF} ogni volta che legge un record.  Indipendentemente da quanti campi
 7437 ci possano essere, l'ultimo campo in un record pu@`o essere rappresentato da
 7438 @code{$NF}. Cos@`{@dotless{i}}, @code{$NF} @`e lo stesso di @code{$7}, che @`e @samp{carino.}.
 7439 Se si cerca di far riferimento a un campo oltre l'ultimo
 7440 (come @code{$8} quando il record ha solo sette campi), si ottiene
 7441 la stringa nulla.  (Se usato in un'operazione numerica si ottiene zero.)
 7442 
 7443 L'uso di @code{$0}, che sarebbe come un riferimento al campo ``numero zero'',
 7444 @`e un caso particolare: rappresenta l'intero record in input.  Si usa quando
 7445 non si @`e interessati a un campo specifico. Vediamo qualche altro esempio:
 7446 
 7447 @example
 7448 $ @kbd{awk '$1 ~ /li/ @{ print $0 @}' mail-list}
 7449 @print{} Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
 7450 @print{} Julie        555-6699     julie.perscrutabor@@skeeve.com   F
 7451 @end example
 7452 
 7453 @noindent
 7454 Questo esempio stampa ogni record del file @file{mail-list} il cui primo campo
 7455 contiene la stringa @samp{li}.
 7456 
 7457 Per converso, il seguente esempio cerca @samp{li} @emph{nell'intero record} e
 7458 stampa il primo e l'ultimo campo di ogni record in input per cui @`e stata
 7459 trovata una corrispondenza:
 7460 
 7461 @example
 7462 $ @kbd{awk '/li/ @{ print $1, $NF @}' mail-list}
 7463 @print{} Amelia F
 7464 @print{} Broderick R
 7465 @print{} Julie F
 7466 @print{} Samuel A
 7467 @end example
 7468 
 7469 @node Campi non costanti
 7470 @section Numeri di campo variabili
 7471 @cindex campi @subentry numero dei
 7472 @cindex numero @subentry di campi in un record
 7473 
 7474 Un numero di campo non @`e necessario che sia una costante.  Nel linguaggio
 7475 @command{awk} si pu@`o usare qualsiasi espressione dopo @samp{$} per far
 7476 riferimento a un campo.  Il valore dell'espressione specifica il numero di
 7477 campo.  Se il valore @`e una stringa, piuttosto che un numero, viene convertito
 7478 in un numero.  Consideriamo questo esempio:
 7479 
 7480 @example
 7481 awk '@{ print $NR @}'
 7482 @end example
 7483 
 7484 @noindent
 7485 Ricordiamo che @code{NR} @`e il numero dei record letti fino a questo punto: uno
 7486 nel primo record, due nel secondo, etc.  Cos@`{@dotless{i}} quest'esempio stampa il primo
 7487 campo del primo record, il secondo campo del secondo record, e cos@`{@dotless{i}} via.
 7488 Per il ventesimo record, @`e stampato il campo numero 20; molto probabilmente il
 7489 record ha meno di 20 campi, perci@`o stampa una riga vuota.
 7490 Questo @`e un altro esempio sull'uso di espressioni come numeri di campo:
 7491 
 7492 @example
 7493 awk '@{ print $(2*2) @}' mail-list
 7494 @end example
 7495 
 7496 @command{awk} calcola l'espressione @samp{(2*2)} e usa il suo valore come
 7497 numero del campo da stampare.  Qui @samp{*} rappresenta la
 7498 moltiplicazione, quindi l'espressione @samp{2*2} ha il valore quattro.  Le
 7499 parentesi vengono usate affinch@'e la moltiplicazione sia eseguita prima
 7500 dell'operazione @samp{$}; sono necessarie ogni volta che c'@`e un operatore
 7501 binario@footnote{A un @dfn{operatore binario}, come @samp{*} per la
 7502 moltiplicazione, servono due operandi.  La distinzione @`e necessaria poich@'e
 7503 @command{awk} ha anche operatori unari (un operando) e ternari (tre
 7504 operandi).}
 7505 nell'espressione del numero di campo.  Questo esempio, dunque, stampa il
 7506 tipo di relazione (il quarto campo) per ogni riga del file
 7507 @file{mail-list}.  (Tutti gli operatori di @command{awk} sono elencati, in
 7508 ordine decrescente di precedenza, in
 7509 @ref{Precedenza}.)
 7510 
 7511 Se il numero di campo calcolato @`e zero, si ottiene l'intero record.
 7512 Quindi, @samp{$(2-2)} ha lo stesso valore di @code{$0}.  Numeri di campo
 7513 negativi non sono consentiti; tentare di far riferimento a uno di essi
 7514 normalmente fa terminare il programma.  (Lo standard POSIX non chiarisce
 7515 cosa succede quando si fa riferimento a un numero di campo negativo.
 7516 @command{gawk} avvisa di questo e fa terminare il programma.  Altre
 7517 implementazioni di @command{awk} possono comportarsi in modo diverso.)
 7518 
 7519 Come accennato in @ref{Campi},
 7520 @command{awk} memorizza il numero di campi del record corrente nella variabile
 7521 predefinita @code{NF} (@pxref{Variabili predefinite}).  Quindi,
 7522 l'espressione @code{$NF} non @`e una funzionalit@`a speciale --- @`e la diretta
 7523 conseguenza della valutazione di @code{NF} e dell'uso di questo valore come
 7524 numero di campo.
 7525 
 7526 @node Cambiare i campi
 7527 @section Cambiare il contenuto di un campo
 7528 
 7529 @cindex campi @subentry cambiare il contenuto dei
 7530 @cindex cambiare @subentry il contenuto dei campi
 7531 Il contenuto di un campo, cos@`{@dotless{i}} come @`e visto da @command{awk}, pu@`o essere
 7532 cambiato all'interno di un programma @command{awk}; questo cambia quello che
 7533 @command{awk} percepisce come record in input corrente.  (Il reale file in
 7534 input non viene toccato; @command{awk} non modifica @emph{mai} il file in
 7535 input).
 7536 Si consideri il seguente esempio e il suo output:
 7537 
 7538 @example
 7539 $ @kbd{awk '@{ numero_pacchi = $3 ; $3 = $3 - 10}
 7540 >        @kbd{print numero_pacchi, $3 @}' inventory-shipped}
 7541 @print{} 25 15
 7542 @print{} 32 22
 7543 @print{} 24 14
 7544 @dots{}
 7545 @end example
 7546 
 7547 @noindent
 7548 Il programma per prima cosa salva il valore originale del campo tre nella
 7549 variabile @code{numero_pacchi}.
 7550 Il segno @samp{-} rappresenta la sottrazione, cos@`{@dotless{i}} questo programma riassegna
 7551 il campo tre, @code{$3}, come il valore originale del campo meno dieci:
 7552 @samp{$3 - 10}.  (@xref{Operatori aritmetici}.)
 7553 Poi stampa il valore originale e quello nuovo del campo tre.
 7554 (Qualcuno nel magazzino ha fatto un errore ricorrente nell'inventariare le
 7555 scatole rosse.)
 7556 
 7557 Perch@'e questo funzioni, il testo in @code{$3} deve poter essere riconosciuto
 7558 come un numero; la stringa di caratteri dev'essere convertita in un numero
 7559 affich@'e il computer possa eseguire operazioni aritmetiche su di essa.  Il
 7560 numero che risulta dalla sottrazione viene nuovamente convertito in
 7561 una stringa di caratteri che quindi diventa il campo tre.
 7562 @xref{Conversione}.
 7563 
 7564 Quando il valore di un campo @`e cambiato (come percepito da @command{awk}), il
 7565 testo del record in input viene ricalcolato per contenere il nuovo campo al
 7566 posto di quello vecchio.  In altre parole, @code{$0} cambia per riflettere il
 7567 campo modificato.  Questo programma
 7568 stampa una copia del file in input, con 10 sottratto dal secondo campo di ogni
 7569 riga:
 7570 
 7571 @example
 7572 $ @kbd{awk '@{ $2 = $2 - 10; print $0 @}' inventory-shipped}
 7573 @print{} Jan 3 25 15 115
 7574 @print{} Feb 5 32 24 226
 7575 @print{} Mar 5 24 34 228
 7576 @dots{}
 7577 @end example
 7578 
 7579 @`E possibile inoltre assegnare contenuti a campi che sono fuori
 7580 intervallo.  Per esempio:
 7581 
 7582 @example
 7583 $ @kbd{awk '@{ $6 = ($5 + $4 + $3 + $2)}
 7584 > @kbd{       print $6 @}' inventory-shipped}
 7585 @print{} 168
 7586 @print{} 297
 7587 @print{} 301
 7588 @dots{}
 7589 @end example
 7590 
 7591 @cindex aggiungere @subentry campi
 7592 @cindex campi @subentry aggiungere
 7593 @noindent
 7594 Abbiamo appena creato @code{$6}, il cui valore @`e la somma dei campi
 7595 @code{$2}, @code{$3}, @code{$4} e @code{$5}.  Il segno @samp{+}
 7596 rappresenta l'addizione.  Per il file @file{inventory-shipped}, @code{$6}
 7597 rappresenta il numero totale di pacchi spediti in un determinato mese.
 7598 
 7599 La creazione di un nuovo campo cambia la copia interna di @command{awk} nel
 7600 record in input corrente, che @`e il valore di @code{$0}.  Cos@`{@dotless{i}}, se si scrive
 7601 @samp{print $0} dopo aver aggiunto un campo, il record stampato include il
 7602 nuovo campo, col numero di separatori di campo appropriati tra esso e i
 7603 campi originariamente presenti.
 7604 
 7605 @cindex @code{OFS} (variabile)
 7606 @cindex output @subentry separatore di campo @seeentry{@code{OFS} (variabile)}
 7607 @cindex campi @subentry separatore di @seealso{@code{OFS}}
 7608 @cindex separatore di campo @seealso{@code{OFS} (variabile)}
 7609 Questa ridefinizione influenza ed @`e influenzata da
 7610 @code{NF} (il numero dei campi; @pxref{Campi}).
 7611 Per esempio, il valore di @code{NF} @`e impostato al numero del campo pi@`u
 7612 elevato che @`e stato creato.
 7613 Il formato preciso di @code{$0} @`e influenzato anche da una funzionalit@`a che
 7614 non @`e ancora stata trattata: il @dfn{separatore di campo di output},
 7615 @code{OFS}, usato per separare i campi (@pxref{Separatori di output}).
 7616 
 7617 Si noti, comunque, che il mero @emph{riferimento} a un campo fuori
 7618 intervallo @emph{non} cambia il valore di @code{$0} o di @code{NF}.
 7619 Far riferimento a un campo fuori intervallo produce solo una stringa nulla.
 7620 Per esempio:
 7621 
 7622 @example
 7623 if ($(NF+1) != "")
 7624     print "non @`e possibile"
 7625 else
 7626     print "@`e tutto normale"
 7627 @end example
 7628 
 7629 @noindent
 7630 dovrebbe stampare @samp{@`e tutto normale}, perch@'e @code{NF+1} @`e certamente
 7631 fuori intervallo.  (@xref{Istruzione if}
 7632 per maggiori informazioni sulle istruzioni @code{if-else} di @command{awk}.
 7633 @xref{Tipi di variabile e confronti}
 7634 per maggiori informazioni sull'operatore @samp{!=}.)
 7635 
 7636 @`E importante notare che facendo un assegnamento a un campo esistente cambia
 7637 il valore di @code{$0} ma non cambia il valore di @code{NF},
 7638 anche qualora si assegni a un campo la stringa nulla.  Per esempio:
 7639 
 7640 @example
 7641 $ @kbd{echo a b c d | awk '@{ OFS = ":"; $2 = ""}
 7642 >                       @kbd{print $0; print NF @}'}
 7643 @print{} a::c:d
 7644 @print{} 4
 7645 @end example
 7646 
 7647 @noindent
 7648 Il campo @`e ancora l@`{@dotless{i}}; ha solo un valore vuoto, delimitato dai due "due punti"
 7649 tra @samp{a} e @samp{c}.
 7650 Questo esempio mostra cosa succede se si crea un nuovo campo:
 7651 
 7652 @example
 7653 $ @kbd{echo a b c d | awk '@{ OFS = ":"; $2 = ""; $6 = "nuovo"}
 7654 >                       @kbd{print $0; print NF @}'}
 7655 @print{} a::c:d::nuovo
 7656 @print{} 6
 7657 @end example
 7658 
 7659 @noindent
 7660 Il campo intermedio, @code{$5}, @`e creato con un valore vuoto
 7661 (indicato dalla seconda coppia di due punti (@code{:}) adiacenti),
 7662 e @code{NF} @`e aggiornato col valore sei.
 7663 
 7664 @cindex angolo buio @subentry variabile @subentry @code{NF}, decremento
 7665 @cindex @code{NF} (variabile) @subentry decremento
 7666 Decrementando @code{NF} si eliminano i campi
 7667 dopo il nuovo valore di @code{NF} e si ricalcola @code{$0}.
 7668 @value{DARKCORNER}
 7669 Vediamo un esempio:
 7670 
 7671 @example
 7672 $ @kbd{echo a b c d e f | awk '@{ print "NF =", NF;}
 7673 > @kbd{                          NF = 3; print $0 @}'}
 7674 @print{} NF = 6
 7675 @print{} a b c
 7676 @end example
 7677 
 7678 @cindex portabilit@`a @subentry variabile @code{NF}, decrementare
 7679 @quotation ATTENZIONE
 7680 Alcune versioni di @command{awk} non
 7681 ricostruiscono @code{$0} quando @code{NF} viene diminuito.
 7682 Fino ad agosto 2018, fra queste c'era BWK @command{awk}; per fortuna
 7683 da allora la sua versione funziona correttamente.
 7684 @end quotation
 7685 
 7686 Infine, ci sono casi in cui conviene forzare
 7687 @command{awk} a ricostruire l'intero record, usando i valori correnti
 7688 dei campi e @code{OFS}.  Per far ci@`o, si usa
 7689 l'apparentemente innocuo assegnamento:
 7690 
 7691 @example
 7692 @group
 7693 $1 = $1   # forza la ricostruzione del record
 7694 print $0  # o qualsiasi altra cosa con $0
 7695 @end group
 7696 @end example
 7697 
 7698 @noindent
 7699 Questo forza @command{awk} a ricostruire il record.  Aggiungere un commento
 7700 rende tutto pi@`u chiaro, come abbiamo appena visto.
 7701 
 7702 C'@`e un rovescio della medaglia nella relazione tra @code{$0} e
 7703 i campi.  Qualsiasi assegnamento a @code{$0} fa s@`{@dotless{i}} che il record sia
 7704 rianalizzato (sintatticamente) e ridiviso in campi usando il valore
 7705 @emph{corrente} di @code{FS}. Questo si applica anche a qualsiasi funzione
 7706 predefinita che aggiorna @code{$0}, come @code{sub()} e @code{gsub()}
 7707 (@pxref{Funzioni per stringhe}).
 7708 
 7709 @sidebar Comprendere @code{$0}
 7710 
 7711 @`E importante ricordare che @code{$0} @`e @emph{l'intero}
 7712 record, esattamente com'@`e stato letto dall'input, compresi tutti gli spazi
 7713 vuoti iniziali e finali, e l'esatto spazio vuoto (o altri caratteri) che
 7714 separa i campi.
 7715 
 7716 @`E un errore comune tentare di cambiare il separatore di campo in un record
 7717 semplicemente impostando @code{FS} e @code{OFS}, e poi
 7718 aspettarsi che un semplice @samp{print} or @samp{print $0} stampi il record
 7719 modificato.
 7720 
 7721 Questo non funziona, poich@'e non @`e stato fatto niente per cambiare quello
 7722 stesso record.  Invece, si deve forzare la ricostruzione del record,
 7723 tipicamente con un'istruzione come @samp{$1 = $1}, come descritto
 7724 in precedenza.
 7725 @end sidebar
 7726 
 7727 
 7728 @node Separatori di campo
 7729 @section Specificare come vengono separati i campi
 7730 
 7731 @menu
 7732 * Separatori di campo di default::   Come di solito sono separati i campi.
 7733 * Separare campi con @dfn{regexp}::  Usare @dfn{regexp} come separatori.
 7734 * Campi di un solo carattere::       Fare di ogni carattere un campo
 7735                                      separato.
 7736 * Separatori campo da riga di comando:: Assegnare @code{FS} dalla riga di
 7737                                      comando.
 7738 * Campo intera riga::                Far s@`{@dotless{i}} che la riga intera sia un
 7739                                      campo solo.
 7740 * Sommario sulla separazione campi:: Alcuni punti finali e una tavola di
 7741                                      sommario.
 7742 @end menu
 7743 
 7744 @cindex @code{FS} (variabile)
 7745 @cindex campi @subentry separare
 7746 @cindex campi @subentry separatore di
 7747 Il @dfn{separatore di campo}, che @`e un carattere singolo o un'espressione
 7748 regolare, controlla il modo in cui @command{awk} suddivide un record in input
 7749 in campi.  @command{awk} fa una scansione del record in input per trovare i
 7750 caratteri che individuano il separatore; i campi sono il testo compreso tra i
 7751 separatori trovati.
 7752 
 7753 Nell'esempio che segue, usiamo il simbolo del punto elenco (@bullet{}) per
 7754 rappresentare gli spazi nell'output.
 7755 Se il separatore di campo @`e @samp{oo}, la seguente riga:
 7756 
 7757 @example
 7758 moo goo gai pan
 7759 @end example
 7760 
 7761 @noindent
 7762 @`e suddivisa in tre campi: @samp{m}, @samp{@bullet{}g}, e
 7763 @samp{@bullet{}gai@bullet{}pan}.
 7764 Notare gli spazi iniziali nei valori del secondo e del terzo campo.
 7765 
 7766 @cindex risoluzione di problemi @subentry @command{awk} usa @code{FS} anzich@'e @code{IFS}
 7767 @cindex problemi @subentry risoluzione di @subentry @command{awk} usa @code{FS} anzich@'e @code{IFS}
 7768 Il separatore di campo @`e rappresentato dalla variable predefinita @code{FS}.
 7769 I programmatori di shell notino:  @command{awk} @emph{non} usa il
 7770 nome @code{IFS} che @`e usato dalle shell conformi a POSIX (come
 7771 la Unix Bourne shell, @command{sh}, o Bash).
 7772 
 7773 @cindex @code{FS} (variabile) @subentry cambiare il valore della
 7774 @cindex cambiare @subentry il valore di @code{FS} (variabile)
 7775 Il valore di @code{FS} si pu@`o cambiare nel programma @command{awk} con
 7776 l'operatore di assegnamento, @samp{=} (@pxref{Operatori di assegnamento}).
 7777 Spesso il momento giusto per far ci@`o @`e all'inizio dell'esecuzione
 7778 prima che sia stato elaborato qualsiasi input, cos@`{@dotless{i}} che il primo record
 7779 sia letto col separatore  appropriato.  Per far questo, si usa il modello di
 7780 ricerca speciale
 7781 @code{BEGIN}
 7782 (@pxref{BEGIN/END}).
 7783 Per esempio, qui impostiamo il valore di @code{FS} alla stringa
 7784 @code{","}:
 7785 
 7786 @example
 7787 awk 'BEGIN @{ FS = "," @} ; @{ print $2 @}'
 7788 @end example
 7789 
 7790 @cindex @code{BEGIN} (regola)
 7791 @noindent
 7792 Data la riga in input:
 7793 
 7794 @example
 7795 John Q. Smith, 29 Oak St., Walamazoo, MI 42139
 7796 @end example
 7797 
 7798 @noindent
 7799 questo programma @command{awk} estrae e stampa la stringa
 7800 @samp{@bullet{}29@bullet{}Oak@bullet{}St.}.
 7801 
 7802 @cindex separatore di campo @subentry scelta del
 7803 @cindex espressioni regolari @subentry come separatore di campo
 7804 @cindex separatore di campo @subentry espressioni regolari come
 7805 A volte i dati in input contengono caratteri separatori che non
 7806 separano i campi nel modo in cui ci si sarebbe atteso.  Per esempio, il
 7807 nome della persona dell'esempio che abbiamo appena usato potrebbe avere un
 7808 titolo o un suffisso annesso, come:
 7809 
 7810 @example
 7811 John Q. Smith, LXIX, 29 Oak St., Walamazoo, MI 42139
 7812 @end example
 7813 
 7814 @noindent
 7815 Lo stesso programma estrarrebbe @samp{@bullet{}LXIX} invece di
 7816 @samp{@bullet{}29@bullet{}Oak@bullet{}St.}.
 7817 Se ci si aspetta che il programma stampi l'indirizzo,
 7818 si rimarr@`a sorpresi.  La morale @`e quella di scegliere la struttura dei dati
 7819 e i caratteri di separazione attentamente per evitare questi problemi.
 7820 (Se i dati non sono in una forma facile da elaborare, pu@`o darsi che
 7821 si possano manipolare con un programma @command{awk} separato.)
 7822 
 7823 
 7824 @node Separatori di campo di default
 7825 @subsection Lo spazio vuoto normalmente separa i campi
 7826 
 7827 @cindex separatore di campo @subentry spazi vuoti come
 7828 @cindex spazi vuoti @subentry come separatore di campo
 7829 @cindex separatore di campo @subentry @code{FS} (variabile) come
 7830 @cindex @code{FS} (variabile) @subentry come separatore di campo 
 7831 I campi sono separati normalmente da spazi vuoti
 7832 (spazi, tabulazioni e ritorni a capo), non solo da spazi singoli.  Due spazi
 7833 in una riga non delimitano un campo vuoto. Il valore di default del separatore
 7834 di campo @code{FS} @`e una stringa contenente un singolo spazio, @w{@code{" "}}.
 7835 Se @command{awk} interpretasse questo valore nel modo usuale, ogni carattere
 7836 di spazio separerebbe campi, quindi due spazi in una riga creerebbero un campo
 7837 vuoto tra di essi.  Il motivo per cui questo non succede @`e perch@'e un singolo
 7838 spazio come valore di @code{FS} @`e un caso particolare: @`e preso per specificare
 7839 il modo di default di delimitare i campi.
 7840 
 7841 Se @code{FS} @`e qualsiasi altro carattere singolo, come @code{","}, ogni
 7842 ricorrenza di quel carattere separa due campi.  Due ricorrenze consecutive
 7843 delimitano un campo vuoto.  Se il carattere si trova all'inizio o alla fine
 7844 della riga, anche quello delimita un campo vuoto.  Il carattere di spazio @`e
 7845 il solo carattere singolo che non segue queste
 7846 regole.
 7847 
 7848 @node Separare campi con @dfn{regexp}
 7849 @subsection Usare @dfn{regexp} come separatori di campo
 7850 
 7851 @cindex espressioni regolari @subentry come separatore di campo
 7852 @cindex separatore di campo @subentry espressioni regolari come
 7853 La precedente @value{SUBSECTION}
 7854 ha illustrato l'uso di caratteri singoli o di stringhe semplici come
 7855 valore di @code{FS}.
 7856 Pi@`u in generale, il valore di @code{FS} pu@`o essere una stringa contenente
 7857 qualsiasi espressione regolare.  Se questo @`e il caso, ogni corrispondenza nel
 7858 record con l'espressione regolare separa campi.  Per esempio, l'assegnamento:
 7859 
 7860 @example
 7861 FS = ", \t"
 7862 @end example
 7863 
 7864 @noindent
 7865 trasforma ogni parte di una riga in input che consiste di una virgola seguita
 7866 da uno spazio e una tabulazione in un separatore di campo.
 7867 @ifinfo
 7868 (@samp{\t}
 7869 @`e una @dfn{sequenza di protezione} che sta per un segno di tabulazione;
 7870 @pxref{Sequenze di protezione},
 7871 per l'elenco completo di sequenze di protezione simili.)
 7872 @end ifinfo
 7873 
 7874 Per un esempio meno banale di espressione regolare, si provi a usare spazi
 7875 singoli per separare campi nel modo in cui sono usate le virgole. @code{FS}
 7876 pu@`o essere impostato a @w{@code{"[@ ]"}} (parentesi quadra sinistra, spazio,
 7877 parentesi quadra destra).  Quest'espressione regolare corrisponde a uno spazio
 7878 @iftex
 7879 singolo e niente pi@`u.  (@pxrefil{Espressioni regolari}).
 7880 @end iftex
 7881 @ifnottex
 7882 singolo e niente pi@`u.  (@pxref{Espressioni regolari}).
 7883 @end ifnottex
 7884 C'@`e una differenza importante tra i due casi di @samp{FS = @w{" "}}
 7885 (uno spazio singolo) e @samp{FS = @w{"[ \t\n]+"}}
 7886 (un'espressione regolare che individua uno o pi@`u spazi, tabulazioni o
 7887 ritorni a capo).  Per entrambi i valori di @code{FS}, i campi sono
 7888 separati da @dfn{serie} (ricorrenze adiacenti multiple) di spazi, tabulazioni
 7889 e/o ritorni a capo.  Comunque, quando il valore di @code{FS} @`e
 7890 @w{@code{" "}}, @command{awk} prima toglie lo spazio vuoto iniziale e finale
 7891 dal record e poi stabilisce dove sono i campi.
 7892 Per esempio, la seguente @dfn{pipeline} stampa @samp{b}:
 7893 
 7894 @example
 7895 $ @kbd{echo ' a b c d ' | awk '@{ print $2 @}'}
 7896 @print{} b
 7897 @end example
 7898 
 7899 @noindent
 7900 Invece la @dfn{pipeline} che segue stampa @samp{a} (notare lo spazio extra
 7901 intorno a ogni lettera):
 7902 
 7903 @example
 7904 $ @kbd{echo ' a  b  c  d ' | awk 'BEGIN @{ FS = "[ \t\n]+" @}}
 7905 >                                  @kbd{@{ print $2 @}'}
 7906 @print{} a
 7907 @end example
 7908 
 7909 @noindent
 7910 @cindex stringa nulla
 7911 @cindex stringa @subentry vuota @seeentry{stringa nulla}
 7912 In questo caso, il primo campo @`e nullo, o vuoto.
 7913 Il taglio degli spazi vuoti iniziale e finale ha luogo anche
 7914 ogniqualvolta @code{$0} @`e ricalcolato.
 7915 Per esempio, si consideri questa @dfn{pipeline}:
 7916 
 7917 @example
 7918 $ @kbd{echo '   a b c d' | awk '@{ print; $2 = $2; print @}'}
 7919 @print{}    a b c d
 7920 @print{} a b c d
 7921 @end example
 7922 
 7923 @noindent
 7924 La prima istruzione @code{print} stampa il record cos@`{@dotless{i}} come @`e stato letto,
 7925 con lo spazio vuoto intatto.  L'assegnamento a @code{$2} ricostruisce
 7926 @code{$0} concatenando insieme @code{$1} fino a @code{$NF},
 7927 separati dal valore di @code{OFS} (che @`e uno spazio per default).
 7928 Poich@'e lo spazio vuoto iniziale @`e stato ignorato quando si @`e trovato
 7929 @code{$1}, esso non fa parte del nuovo @code{$0}.  Alla fine, l'ultima
 7930 istruzione @code{print} stampa il nuovo @code{$0}.
 7931 
 7932 @cindex @code{FS} (variabile) @subentry contenente @code{^}
 7933 @cindex @code{^} (circonflesso) @subentry in @code{FS}
 7934 @cindex angolo buio @subentry @code{^}, in @code{FS}
 7935 C'@`e un'ulteriore sottigliezza da considerare quando si usano le espressioni
 7936 regolari per separare i campi.
 7937 Non @`e ben specificato nello standard POSIX, n@'e altrove, cosa
 7938 significhi @samp{^} nella divisione dei campi.  Il @samp{^} cerca
 7939 corrispondenze solo all'inizio dell'intero record?  Oppure ogni separatore di
 7940 campo @`e una nuova stringa?  Di fatto versioni differenti di @command{awk}
 7941 rispondono a questo quesito in modo diverso, e non si dovrebbe far affidamento
 7942 su alcun comportamento specifico nei propri programmi.
 7943 @value{DARKCORNER}
 7944 
 7945 @cindex Brian Kernighan @subentry @command{awk} di
 7946 Di sicuro, BWK @command{awk} individua con @samp{^}
 7947 solo l'inizio del record.  Anche @command{gawk}
 7948 funziona in questo modo. Per esempio:
 7949 
 7950 @example
 7951 $ @kbd{echo 'xxAA  xxBxx  C' |}
 7952 > @kbd{gawk -F '(^x+)|( +)' '@{ for (i = 1; i <= NF; i++)}
 7953 > @kbd{                            printf "-->%s<--\n", $i @}'}
 7954 @print{} --><--
 7955 @print{} -->AA<--
 7956 @print{} -->xxBxx<--
 7957 @print{} -->C<--
 7958 @end example
 7959 
 7960 @node Campi di un solo carattere
 7961 @subsection Fare di ogni carattere un campo separato
 7962 
 7963 @cindex estensioni comuni @subentry campi di un solo carattere
 7964 @cindex comuni @subentry estensioni @subentry campi di un solo carattere
 7965 @cindex differenze tra @command{awk} e @command{gawk} @subentry campi di un solo carattere
 7966 @cindex singolo carattere @subentry campi di un
 7967 @cindex campi @subentry di un solo carattere
 7968 Ci sono casi in cui si abbia la necessit@`a di analizzare ciascun carattere di un
 7969 record separatamente.  Questo si pu@`o fare in @command{gawk} semplicemente
 7970 assegnando la stringa nulla (@code{""}) a @code{FS}. @value{COMMONEXT}
 7971 In questo caso,
 7972 ogni singolo carattere nel record diventa un campo separato.
 7973 Per esempio:
 7974 
 7975 @example
 7976 $ @kbd{echo a b | gawk 'BEGIN @{ FS = "" @}}
 7977 >                  @kbd{@{}
 7978 >                      @kbd{for (i = 1; i <= NF; i = i + 1)}
 7979 >                          @kbd{print "Il campo", i, "@`e", $i}
 7980 >                  @kbd{@}'}
 7981 @print{} Il campo 1 @`e a
 7982 @print{} Il campo 2 @`e
 7983 @print{} Il campo 3 @`e b
 7984 @end example
 7985 
 7986 @cindex angolo buio @subentry @code{FS} come stringa nulla
 7987 @cindex @code{FS} (variabile) @subentry come stringa nulla
 7988 Tradizionalmente, il comportamento di @code{FS} quando @`e impostato a
 7989 @code{""} non @`e stato definito.  In questo caso, la  maggior parte delle
 7990 versioni UNIX di @command{awk} trattano l'intero record come se avesse un
 7991 unico campo.
 7992 @value{DARKCORNER}
 7993 In modalit@`a di compatibilit@`a
 7994 (@pxref{Opzioni}),
 7995 se @code{FS} @`e la stringa nulla, anche @command{gawk}
 7996 si comporta in questo modo.
 7997 
 7998 @node Separatori campo da riga di comando
 7999 @subsection Impostare @code{FS} dalla riga di comando
 8000 @cindex @option{-F} (opzione) sulla riga di comando
 8001 @cindex opzione @subentry @option{-F} @subentry sulla riga di comando
 8002 @cindex separatore di campo @subentry specificare sulla riga di comando
 8003 @cindex riga di comando @subentry impostare @code{FS} sulla
 8004 @cindex @code{FS} (variabile) @subentry impostare da riga di comando
 8005 
 8006 @code{FS} pu@`o essere impostata sulla riga di comando.  Per far questo si usa
 8007 l'opzione @option{-F}.  Per esempio:
 8008 
 8009 @example
 8010 awk -F, '@var{programma}' @var{i-file-di-input}
 8011 @end example
 8012 
 8013 @noindent
 8014 imposta @code{FS} al carattere @samp{,}.  Si noti che l'opzione richiede
 8015 un carattere maiuscolo @samp{F} anzich@'e minuscolo @samp{f}.  Quest'ultima
 8016 opzione (@option{-f}) serve a specificare il file contenente un programma
 8017 @command{awk}.
 8018 
 8019 Il valore usato per l'argomento di @option{-F} @`e elaborato esattamente nello
 8020 stesso modo degli assegnamenti alla variabile predefinita @code{FS}. Qualsiasi
 8021 carattere speciale nel separatore di campo dev'essere protetto in modo
 8022 appropriato.  Per esempio, per usare un @samp{\} come separatore di campo
 8023 sulla riga di comando, si dovrebbe battere:
 8024 
 8025 @example
 8026 # equivale a FS = "\\"
 8027 awk -F\\\\ '@dots{}' file @dots{}
 8028 @end example
 8029 
 8030 @noindent
 8031 @cindex separatore di campo @subentry @code{\} (barra inversa) come
 8032 @cindex @code{\} (barra inversa) @subentry come separatore di campo
 8033 @cindex barra inversa (@code{\}) @subentry come separatore di campo
 8034 Poich@'e @samp{\} @`e usato nella shell per proteggere caratteri, a @command{awk}
 8035 arriva @samp{-F\\}.  Quindi @command{awk} elabora @samp{\\} per caratteri di
 8036 protezione (@pxref{Sequenze di protezione}), producendo alla fine
 8037 un unico @samp{\} da usare come separatore di campo.
 8038 
 8039 @c @cindex historical features
 8040 Come caso particolare, in modalit@`a di compatibilit@`a
 8041 (@pxref{Opzioni}),
 8042 se l'argomento di @option{-F} @`e @samp{t}, @code{FS} @`e impostato al
 8043 carattere di tabulazione.  Se si immette @samp{-F\t} nella
 8044 shell, senza che sia tra apici, @samp{\} viene cancellata,
 8045 cos@`{@dotless{i}} @command{awk}
 8046 conclude che si vuole realmente che i campi siano separati da tabulazioni e
 8047 non da delle @samp{t}.  Si usi @samp{-v FS="t"} o @samp{-F"[t]"} sulla riga di
 8048 comando se si vuole separare i campi con delle @samp{t}.
 8049 Quando non si @`e in modalit@`a di compatibilit@`a si deve usare @samp{-F '\t'} per
 8050 specificare che le tabulazioni separano i campi.
 8051 
 8052 Come esempio, usiamo un file di programma @command{awk} chiamato
 8053 @file{edu.awk} che contiene il criterio di ricerca @code{/edu/} e l'azione
 8054 @samp{print $1}:
 8055 
 8056 @example
 8057 /edu/   @{ print $1 @}
 8058 @end example
 8059 
 8060 Impostiamo inoltre @code{FS} al carattere @samp{-} ed eseguiamo il programma
 8061 sul file @file{mail-list}.  Il seguente comando stampa un elenco dei nomi
 8062 delle persone che lavorano all'universit@`a o che la frequentano, e le prime tre
 8063 cifre dei loro numeri di telefono:
 8064 
 8065 @example
 8066 $ @kbd{awk -F- -f edu.awk mail-list}
 8067 @print{} Fabius       555
 8068 @print{} Samuel       555
 8069 @print{} Jean
 8070 @end example
 8071 
 8072 @noindent
 8073 Si noti la terza riga di output.  La terza riga
 8074 nel file originale @`e simile a questa:
 8075 
 8076 @example
 8077 Jean-Paul   555-2127  jeanpaul.campanorum@@nyu.edu   R
 8078 @end example
 8079 
 8080 Il @samp{-} che fa parte del nome della persona @`e stato usato come
 8081 separatore di campo, al posto del @samp{-} presente nel numero di telefono,
 8082 che ci si aspettava venisse usato.
 8083 Questo lascia intuire il motivo per cui si deve stare attenti nella scelta
 8084 dei separatori di campo e di record.
 8085 
 8086 @cindex Unix @command{awk} @subentry file di password @subentry separatore di campo e
 8087 Forse l'uso pi@`u comune di un solo carattere come separatore di campo avviene
 8088 quando si elabora il file delle password di un sistema Unix.  Su molti sistemi
 8089 Unix, ogni utente @`e descritto da un elemento nel file delle password del
 8090 sistema, che contiene una riga singola per ogni utente.  In queste righe le
 8091 informazioni sono separate da dei caratteri ":".  Il
 8092 primo campo @`e il nome di login dell'utente e il secondo @`e la password
 8093 dell'utente criptata o oscurata (una password oscurata @`e indicata dalla
 8094 presenza di una sola @samp{x} nel secondo campo).  Una riga nel file delle
 8095 password potrebbe essere simile a questa:
 8096 
 8097 @cindex Robbins @subentry Arnold
 8098 @example
 8099 arnold:x:2076:10:Arnold Robbins:/home/arnold:/bin/bash
 8100 @end example
 8101 
 8102 Il seguente programma esamina il file delle password di sistema e stampa le
 8103 voci relative agli utenti il cui nome completo non @`e presente nel file:
 8104 
 8105 @example
 8106 awk -F: '$5 == ""' /etc/passwd
 8107 @end example
 8108 
 8109 @node Campo intera riga
 8110 @subsection Fare di una riga intera un campo solo
 8111 
 8112 Occasionalmente, @`e utile trattare l'intera riga in input come un solo campo.
 8113 Questo si pu@`o fare facilmente e in modo portabile semplicemente impostando
 8114 @code{FS} a @code{"\n"} (un ritorno a capo).@footnote{Grazie ad
 8115 Andrew Schorr per questo suggerimento.}
 8116 
 8117 @example
 8118 awk -F'\n' '@var{programma}' @var{file @dots{}}
 8119 @end example
 8120 
 8121 @noindent
 8122 In questo caso, @code{$1} coincide con @code{$0}.
 8123 
 8124 @sidebar Cambiare @code{FS} non incide sui campi
 8125 
 8126 @cindex POSIX @command{awk} @subentry separatore di campo
 8127 @cindex separatore di campo @subentry POSIX e il
 8128 Secondo lo standard POSIX, si suppone che @command{awk} si comporti
 8129 come se ogni record sia stato diviso in campi nel momento in cui @`e stato
 8130 letto.  In particolare, ci@`o vuol dire che se si cambia il valore di
 8131 @code{FS} dopo che un record @`e stato letto, il valore dei campi (cio@'e
 8132 la loro suddivisione) sar@`a ancora quello ottenuto usando il precedente
 8133 valore di @code{FS}, non quello nuovo.
 8134 
 8135 @cindex angolo buio @subentry separatore di campo
 8136 @cindex @command{sed} (programma di utilit@`a)
 8137 @cindex programma di utilit@`a @subentry @command{sed}
 8138 @cindex editori di flusso
 8139 Comunque, molte delle pi@`u vecchie implementazioni di @command{awk} non
 8140 funzionano in questo modo.  Invece, rimandano la divisione dei campi
 8141 fino a quando si fa effettivamente riferimento a un campo.  I campi sono
 8142 divisi usando il valore @emph{corrente} di @code{FS}!
 8143 @value{DARKCORNER}
 8144 Questo comportamento pu@`o essere di difficile
 8145 identificazione.  Il seguente esempio illustra la differenza
 8146 tra i due metodi. Lo @dfn{script}
 8147 
 8148 @example
 8149 sed 1q /etc/passwd | awk '@{ FS = ":" ; print $1 @}'
 8150 @end example
 8151 
 8152 @noindent
 8153 normalmente stampa:
 8154 
 8155 @example
 8156 @print{} root
 8157 @end example
 8158 
 8159 @noindent
 8160 su un'implementazione non standard di @command{awk}, mentre @command{gawk}
 8161 stampa l'intera prima riga del file, qualcosa come:
 8162 
 8163 @example
 8164 root:x:0:0:Root:/:
 8165 @end example
 8166 
 8167 (Il comando @command{sed}@footnote{Il programma di utilit@`a @command{sed} @`e un
 8168 ``editore di flusso''.  Anche il suo comportamento @`e definito dallo standard
 8169 POSIX.} appena visto stampa solo la prima riga di @file{/etc/passwd}.)
 8170 @end sidebar
 8171 
 8172 @node Sommario sulla separazione campi
 8173 @subsection Sommario sulla separazione dei campi
 8174 
 8175 @`E importante ricordare che quando si assegna una costante stringa
 8176 come valore di @code{FS}, questa subisce una normale elaborazione di stringa
 8177 da parte di @command{awk}.  Per esempio, con Unix @command{awk} e
 8178 @command{gawk}, l'assegnamento @samp{FS = "\.."} assegna la stringa di
 8179 caratteri @code{".."}
 8180 a @code{FS} (la barra inversa @`e tolta).  Questo crea un'espressione regolare
 8181 che significa ``i campi sono separati da ricorrenze di due caratteri
 8182 qualsiasi''.  Se invece si vuole che i campi siano separati da un punto
 8183 seguito da un qualsiasi carattere singolo, si deve usare @samp{FS = "\\.."}.
 8184 
 8185 Il seguente elenco riassume come i campi vengono divisi, in base al valore
 8186 di @code{FS} (@samp{==} significa ``@`e uguale a''):
 8187 
 8188 @table @code
 8189 @item FS == " "
 8190 I campi sono separati da serie di spazi vuoti.  Gli spazi vuoti iniziale e
 8191 finale sono ignorati.  Questo @`e il comportamento di default.
 8192 
 8193 @item FS == @var{qualsiasi altro carattere singolo}
 8194 I campi sono separati da ogni ricorrenza del carattere.  Ricorrenze
 8195 successive multiple delimitano campi vuoti, e lo stesso fanno le ricorrenze
 8196 iniziali e finali del carattere.
 8197 Il carattere pu@`o essere anche un metacarattere di espressione regolare, che
 8198 non @`e necessario proteggere.
 8199 
 8200 @item FS == @var{espressione regolare}
 8201 I campi sono separati da ricorrenze di caratteri che corrispondono alla
 8202 @var{espressione regolare}.  Corrispondenze iniziali e finali della
 8203 @dfn{regexp} delimitano campi vuoti.
 8204 @item FS == ""
 8205 Ogni sinngolo carattere nel record diventa un campo separato.
 8206 (Questa @`e un'estensione comune; non @`e specificata dallo standard POSIX.)
 8207 @end table
 8208 
 8209 @sidebar @code{FS} e @code{IGNORECASE}
 8210 La variabile @code{IGNORECASE}
 8211 (@pxref{Variabili modificabili dall'utente})
 8212 influisce sulla divisione del campo @emph{solo} quando il valore di @code{FS}
 8213 @`e un'espressione regolare.  Non ha nessun effetto quando @code{FS} @`e un
 8214 singolo carattere, anche se quel carattere @`e una lettera.  Quindi, nel
 8215 seguente codice:
 8216 
 8217 @example
 8218 FS = "c"
 8219 IGNORECASE = 1
 8220 $0 = "aCa"
 8221 print $1
 8222 @end example
 8223 
 8224 @noindent
 8225 L'output @`e @samp{aCa}.  Se si vuol veramente dividere i campi su un carattere
 8226 alfabetico ignorandone il maiuscolo/minuscolo, si deve usare un'espressione
 8227 regolare che lo far@`a in automatico (p.es., @samp{FS = "[c]"}).  In questo
 8228 caso, @code{IGNORECASE} avr@`a effetto.
 8229 @end sidebar
 8230 
 8231 
 8232 @node Dimensione costante
 8233 @section Leggere campi di larghezza costante
 8234 
 8235 
 8236 @cindex campi @subentry di larghezza costante
 8237 @cindex larghezza costante @subentry campi di
 8238 @cindex funzionalit@`a @subentry avanzate @subentry campi di larghezza costante
 8239 @c O'Reilly doesn't like it as a note the first thing in the section.
 8240 @ifnotinfo
 8241 Questa
 8242 @end ifnotinfo
 8243 @ifinfo
 8244 Questo
 8245 @end ifinfo
 8246 @value{SECTION} tratta una funzionalit@`a avanzata
 8247 di @command{gawk}.  Se si @`e un utente alle prime armi di @command{awk},
 8248 la si pu@`o saltare in prima lettura.
 8249 
 8250 @command{gawk} fornisce una funzionalit@`a per il trattamento di campi
 8251 a larghezza fissa senza un separatore di campo distintivo.  Questa
 8252 funzionalit@`a @`e trattata
 8253 @ifnotinfo
 8254 nelle seguenti
 8255 @end ifnotinfo
 8256 @ifinfo
 8257 nei seguenti
 8258 @end ifinfo
 8259 @value{SUBSECTIONS}.
 8260 
 8261 @menu
 8262 * Dati di lunghezza fissa::     Elaborare dati di lunghezza fissa.
 8263 * Saltare campi intermedi::     Saltare campi intermedi.
 8264 * Consentire dati a fine record:: Trattare dati opzionali a fine record.
 8265 * Campi con dati a larghezza fissa:: Valore di campi con dati a larghezza
 8266                                      fissa.
 8267 @end menu
 8268 
 8269 @node Dati di lunghezza fissa
 8270 @subsection Elaborare dati di lunghezza fissa
 8271 
 8272 Un esempio di dati a lunghezza fissa pu@`o essere l'input per vecchi programmi
 8273 Fortran dove dei numeri sono elencati uno dopo l'altro, o l'output di
 8274 programmi che non prevedono che questo loro output sia dato in input ad
 8275 altri programmi.
 8276 
 8277 Un esempio di quest'ultimo caso @`e una tabella dove tutte le colonne sono
 8278 allineate usando un numero variabile di spazi e dove @emph{i campi vuoti
 8279 sono solo spazi}.  Chiaramente, la normale divisione in campi di
 8280 @command{awk} basata su @code{FS} non funziona bene in questa situazione.
 8281 Sebbene un programma @command{awk} portabile possa usare una serie di
 8282 chiamate @code{substr()} su @code{$0} (@pxref{Funzioni per stringhe}),
 8283 questo @`e scomodo e inefficiente se il numero dei campi @`e elevato.
 8284 
 8285 @cindex risoluzione di problemi @subentry errori fatali @subentry specificare larghezza dei campi
 8286 @cindex problemi @subentry risoluzione di @subentry errori fatali, specificare larghezza dei campi
 8287 @cindex @command{w} (programma di utilit@`a)
 8288 @cindex programma di utilit@`a @subentry @command{w}
 8289 @cindex @code{FIELDWIDTHS} (variabile)
 8290 @cindex @command{gawk} @subentry variabile @subentry @code{FIELDWIDTHS} in
 8291 La suddivisione di un record in input in campi a larghezza fissa viene
 8292 specificata assegnando una stringa contenente numeri separati da spazi alla
 8293 variabile predefinita @code{FIELDWIDTHS}.  Ogni numero specifica la larghezza
 8294 del campo, @emph{comprese} le colonne tra i campi.  Se si vogliono ignorare le
 8295 colonne tra i campi si pu@`o specificare la loro larghezza come un campo
 8296 separato che verr@`a poi ignorato.
 8297 @`E un errore fatale definire una larghezza di campo che abbia un valore
 8298 negativo.
 8299 
 8300 I dati seguenti costituiscono un output del programma di utilit@`a
 8301 Unix @command{w}.  @`E utile per spiegare l'uso di @code{FIELDWIDTHS}:
 8302 
 8303 @example
 8304 @group
 8305  10:06pm  up 21 days, 14:04,  23 users
 8306 User     tty       login@  idle   JCPU   PCPU  what
 8307 hzuo     ttyV0     8:58pm            9      5  vi p24.tex
 8308 hzang    ttyV3     6:37pm    50                -csh
 8309 eklye    ttyV5     9:53pm            7      1  em thes.tex
 8310 dportein ttyV6     8:17pm  1:47                -csh
 8311 gierd    ttyD3    10:00pm     1                elm
 8312 dave     ttyD4     9:47pm            4      4  w
 8313 brent    ttyp0    26Jun91  4:46  26:46   4:41  bash
 8314 dave     ttyq4    26Jun9115days     46     46  wnewmail
 8315 @end group
 8316 @end example
 8317 
 8318 Il seguente programma prende l'input sopra mostrato, converte il tempo di
 8319 inattivit@`a
 8320 in numero di secondi, e stampa i primi due campi e il tempo di inattivit@`a
 8321 calcolato:
 8322 
 8323 @example
 8324 BEGIN  @{ FIELDWIDTHS = "9 6 10 6 7 7 35" @}
 8325 NR > 2 @{
 8326     inat = $4
 8327     sub(/^ +/, "", inat)   # togli spazi prima del valore
 8328     if (inat == "")
 8329         inat = 0
 8330     if (inat ~ /:/) @{      # hh:mm
 8331         split(inat, t, ":")
 8332         inat = t[1] * 60 + t[2]
 8333     @}
 8334     if (inat ~ /days/)
 8335         inat *= 24 * 60 * 60
 8336 
 8337     print $1, $2, inat
 8338 @}
 8339 @end example
 8340 
 8341 @quotation NOTA
 8342 Questo programma usa diverse funzionalit@`a di @command{awk} non
 8343 ancora trattate.
 8344 @end quotation
 8345 
 8346 L'esecuzione del programma sui dati produce il seguente risultato:
 8347 
 8348 @example
 8349 hzuo      ttyV0  0
 8350 hzang     ttyV3  50
 8351 eklye     ttyV5  0
 8352 dportein  ttyV6  107
 8353 gierd     ttyD3  1
 8354 dave      ttyD4  0
 8355 brent     ttyp0  286
 8356 dave      ttyq4  1296000
 8357 @end example
 8358 
 8359 Un altro esempio (forse pi@`u pratico) di dati di input con larghezza costante @`e
 8360 l'input da un mazzo di schede elettorali.  In alcune parti degli Stati Uniti,
 8361 i votanti marcano le loro scelte perforando delle schede elettroniche.
 8362 
 8363 Queste schede vengono poi elaborate per contare i voti espressi per ogni
 8364 singolo candidato o su ogni determinato quesito.  Siccome un votante pu@`o
 8365 scegliere di non votare su alcune questioni, qualsiasi colonna della scheda
 8366 pu@`o essere vuota.  Un programma @command{awk} per elaborare tali dati potrebbe
 8367 usare la funzionalit@`a @code{FIELDWIDTHS} per semplificare la lettura dei dati.
 8368 (Naturalmente, riuscire a eseguire @command{gawk} su un sistema con lettori di
 8369 schede @`e un'altra storia!)
 8370 
 8371 @node Saltare campi intermedi
 8372 @subsection Saltare campi intermedi
 8373 
 8374 A partire dalla @value{PVERSION} 4.2, ogni specifica di una larghezza di campo
 8375 pu@`o essere opzionalmente preceduta da un valore, delimitato da due punti
 8376 (@code{:}), che indica il numero di caratteri da saltare prima dell'inizio del campo
 8377 successivo.  Quindi, il programma precedente potrebbe essere riscritto per
 8378 specificare @code{FIELDWIDTHS} in questo modo:
 8379 
 8380 @example
 8381 BEGIN  @{ FIELDWIDTHS = "8 1:5 4:7 6 1:6 1:6 2:33" @}
 8382 @end example
 8383 
 8384 In questo modo si eliminano alcuni degli spazi bianchi che separano fra
 8385 loro i campo.  Dopo esser stato cos@`{@dotless{i}} modificato, il programma produce
 8386 i risultati seguenti:
 8387 
 8388 @example
 8389 hzang    ttyV3 50
 8390 eklye    ttyV5 0
 8391 dportein ttyV6 107
 8392 gierd    ttyD3 1
 8393 dave     ttyD4 0
 8394 brent    ttyp0 286
 8395 dave     ttyq4 1296000
 8396 @end example
 8397 
 8398 @node Consentire dati a fine record
 8399 @subsection Trattare dati opzionali a fine record
 8400 
 8401 A volte dati di larghezza fissa possono essere seguiti da ulteriori dati
 8402 la cui lunghezza non @`e nota @dfn{a priori}.  Tali dati possono essere
 8403 o non essere presenti, ma nel caso che lo siano dovrebbe essere possibile
 8404 elaborarli all'interno di un programma @command{awk}.
 8405 
 8406 A partire dalla @value{PVERSION} 4.2, per consentire di designare
 8407 ``tutto il resto del record dopo i campi a lunghezza fissa''
 8408 @command{gawk} prevede la possibilit@`a di aggiungere un carattere @samp{*}
 8409 in fondo alla descrizione contenuta in @code{FIELDWIDTHS}.
 8410 Ci pu@`o essere un solo carattere @samp{*}, e dev'essere l'ultimo carattere
 8411 diverso da uno spazio in @code{FIELDWIDTHS}.
 8412 Per esempio:
 8413 
 8414 @example
 8415 $ @kbd{cat fw.awk}                        @ii{Visualizza il programma}
 8416 @print{} BEGIN @{ FIELDWIDTHS = "2 2 *" @}
 8417 @print{} @{ print NF, $1, $2, $3 @}
 8418 $ @kbd{cat fw.in}                         @ii{Visualizza l'input dell'esempio}
 8419 @print{} 1234abcdefghi
 8420 $ @kbd{gawk -f fw.awk fw.in}              @ii{Esegui il programma}
 8421 @print{} 3 12 34 abcdefghi
 8422 @end example
 8423 
 8424 @node Campi con dati a larghezza fissa
 8425 @subsection Valore di campi con dati a larghezza fissa
 8426 
 8427 Fin qui, tutto bene.  Ma cosa succede se non ci sono abbastanza dati
 8428 rispetto a quelli che dovrebbero essere presenti in base alla descrizione
 8429 contenuta in @code{FIELDWIDTHS}?  E invece cosa succede se i dati sono
 8430 pi@`u di quelli previsti?
 8431 
 8432 Per molti anni, quel che succede in questi casi non era definito con
 8433 esattezza.  A partire dalla @value{PVERSION} 4.2 le regole sono le seguenti:
 8434 
 8435 @table @asis
 8436 @item Dati sufficienti per uno o pi@`u campi
 8437 Per esempio, se @code{FIELDWIDTHS} @`e impostato a @code{"2 3 4"} e il record
 8438 in input @`e @samp{aabbb}.  In questo caso, @code{NF} @`e impostato a due.
 8439 
 8440 @item Dati insufficienti per la specifica di un campo
 8441 Per esempio, se @code{FIELDWIDTHS} @`e impostato a @code{"2 3 4"} e il record
 8442 in input @`e @samp{aab}.  In questo caso, @code{NF} @`e impostato a due e
 8443 il campo numero @code{$2} ha come valore @code{"b"}.  L'idea @`e che, anche se
 8444 ci sono meno caratteri di quelli previsti, qualcosa @`e presente, e quindi il
 8445 dato dovrebbe essere reso disponibile al programma.
 8446 
 8447 @item Troppi dati
 8448 Per esempio, se @code{FIELDWIDTHS} @`e impostato a @code{"2 3 4"} e il record
 8449 in input @`e @samp{aabbbccccddd}.  In questo caso, @code{NF} @`e impostato a
 8450 tre e i caratteri in eccesso (@samp{ddd}) sono ignorati.  Se si vuole che
 8451 @command{gawk} elabori i caratteri in pi@`u, si deve aggiungere un @samp{*}
 8452 in fondo, nel valore di @code{FIELDWIDTHS}.
 8453 
 8454 @item Troppi dati, ma @`e stato specificato @samp{*}
 8455 Per esempio, se @code{FIELDWIDTHS} @`e impostato a @code{"2 3 4 *"} e il record
 8456 in input @`e @samp{aabbbccccddd}.  In questo caso, @code{NF} @`e impostato a
 8457 quattro, e @code{$4} ha come valore @code{"ddd"}.
 8458 
 8459 @end table
 8460 
 8461 L'assegnazione di un valore a @code{FS} fa s@`{@dotless{i}} che @command{gawk} usi @code{FS}
 8462 per separare nuovamente i campi.  Si pu@`o usare @samp{FS = FS} per ottenere
 8463 questo effetto, senza dover conoscere il valore corrente di @code{FS}.
 8464 Per vedere quale tipo di separazione sia in atto,
 8465 si pu@`o usare @code{PROCINFO["FS"]}
 8466 (@pxref{Variabili auto-assegnate}).
 8467 Il suo valore @`e @code{"FS"} se si usa la normale separazione in campi,
 8468 o @code{"FIELDWIDTHS"} se si usa la separazione in campi a larghezza fissa:
 8469 
 8470 @example
 8471 if (PROCINFO["FS"] == "FS")
 8472     @var{separazione in campi normale}@dots{}
 8473 else if  (PROCINFO["FS"] == "FIELDWIDTHS")
 8474     @var{separazione in campi a larghezza fissa}@dots{}
 8475 else
 8476     @var{separazione dei campi in base al contenuto}@dots{} @ii{(si veda
 8477 @ifnotinfo
 8478 la @value{SECTION} successiva)}
 8479 @end ifnotinfo
 8480 @ifinfo
 8481 il @value{SECTION} successivo)}
 8482 @end ifinfo
 8483 @end example
 8484 
 8485 Quest'informazione @`e utile quando si scrive una funzione che
 8486 necessita di cambiare temporaneamente @code{FS} o @code{FIELDWIDTHS},
 8487 leggere alcuni record, e poi ripristinare le impostazioni originali
 8488 (@pxref{Funzioni Passwd},
 8489 per un esempio di tale funzione).
 8490 
 8491 @node Separazione in base al contenuto
 8492 @section Definire i campi in base al contenuto
 8493 
 8494 @menu
 8495 * File CSV::                    Ancora sui file CSV.
 8496 @end menu
 8497 
 8498 @c O'Reilly doesn't like it as a note the first thing in the section.
 8499 @ifnotinfo
 8500 Questa
 8501 @end ifnotinfo
 8502 @ifinfo
 8503 Questo
 8504 @end ifinfo
 8505 @value{SECTION} tratta una funzionalit@`a avanzata
 8506 di @command{gawk}.  Se si @`e un utente alle prime armi di @command{awk},
 8507 la si pu@`o saltare in prima lettura.
 8508 
 8509 @cindex funzionalit@`a @subentry avanzate @subentry specificare il contenuto dei campi
 8510 
 8511 Normalmente, quando si usa @code{FS}, @command{gawk} definisce i campi come
 8512 le parti del record che si trovano tra due separatori di campo.  In altre
 8513 parole, @code{FS} definisce cosa un campo @emph{non @`e}, invece di cosa
 8514 @emph{@`e}.
 8515 Tuttavia, ci sono casi in cui effettivamente si ha bisogno di definire i campi
 8516 in base a cosa essi sono, e non in base a cosa non sono.
 8517 
 8518 Il caso pi@`u emblematico @`e quello dei dati cosiddetti @dfn{comma-separated
 8519 value} (CSV).  Molti fogli elettronici, per esempio, possono esportare i dati
 8520 in file di testo, dove ogni record termina con un ritorno a capo e i campi
 8521 sono separati tra loro da virgole. Se le virgole facessero solo da separatore
 8522 fra i dati non ci sarebbero problemi.  Il problema sorge se uno dei campi
 8523 contiene una virgola @emph{al suo interno}.
 8524 In queste situazioni, la maggioranza dei programmi include il campo fra
 8525 doppi apici.@footnote{Il formato CSV non ha avuto, per molti anni, una
 8526 definizione standard formale.
 8527 @uref{http://www.ietf.org/rfc/rfc4180.txt, RFC 4180}
 8528 standardizza le pratiche pi@`u comuni.}
 8529 Cos@`{@dotless{i}}, potremmo avere dei dati di questo tipo:
 8530 
 8531 @example
 8532 @c file eg/misc/addresses.csv
 8533 Robbins,Arnold,"1234 A Pretty Street, NE",MyTown,MyState,12345-6789,USA
 8534 @c endfile
 8535 @end example
 8536 
 8537 @cindex @command{gawk} @subentry variabile @subentry @code{FPAT} in
 8538 @cindex @code{FPAT} (variabile)
 8539 La variabile @code{FPAT} offre una soluzione per casi come questo.
 8540 Il valore di @code{FPAT} dovrebbe essere una stringa formata da un'espressione
 8541 regolare.  L'espressione regolare descrive il contenuto di ciascun campo.
 8542 
 8543 Nel caso dei dati CSV visti prima, ogni campo @`e ``qualsiasi cosa che non
 8544 sia una virgola,'' oppure ``doppi apici, seguiti da qualsiasi cosa che non
 8545 siano doppi apici, e doppi apici di chiusura''.  (Ci sono definizioni di
 8546 dati CSV pi@`u complicate, vedere pi@`u sotto.)
 8547 Se fosse scritta come una
 8548 costante @dfn{regexp}
 8549 @iftex
 8550 (@pxrefil{Espressioni regolari}),
 8551 @end iftex
 8552 @ifnottex
 8553 (@pxref{Espressioni regolari}),
 8554 @end ifnottex
 8555 sarebbe @code{/([^,]+)|("[^"]+")/}.
 8556 Dovendola scrivere come stringa si devono proteggere i doppi apici,
 8557 e quindi si deve scrivere:
 8558 
 8559 @example
 8560 FPAT = "([^,]+)|(\"[^\"]+\")"
 8561 @end example
 8562 
 8563 Come esempio pratico, si pu@`o vedere questo semplice programma che analizza
 8564 e divide i dati:
 8565 
 8566 @example
 8567 @c file eg/misc/simple-csv.awk
 8568 @group
 8569 BEGIN @{
 8570     FPAT = "([^,]+)|(\"[^\"]+\")"
 8571 @}
 8572 @end group
 8573 
 8574 @group
 8575 @{
 8576     print "NF = ", NF
 8577     for (i = 1; i <= NF; i++) @{
 8578         printf("$%d = <%s>\n", i, $i)
 8579     @}
 8580 @}
 8581 @end group
 8582 @c endfile
 8583 @end example
 8584 
 8585 Eseguendolo, avendo in input la riga vista sopra, si ottiene:
 8586 
 8587 @example
 8588 $ @kbd{gawk -f simple-csv.awk addresses.csv}
 8589 NF =  7
 8590 $1 = <Robbins>
 8591 $2 = <Arnold>
 8592 $3 = <"1234 A Pretty Street, NE">
 8593 $4 = <MyTown>
 8594 $5 = <MyState>
 8595 $6 = <12345-6789>
 8596 $7 = <USA>
 8597 @end example
 8598 
 8599 Si noti la virgola contenuta nel valore del campo @code{$3}.
 8600 
 8601 Un semplice miglioramento se si elaborano dati CSV di questo tipo potrebbe
 8602 essere quello di rimuovere i doppi apici, se presenti, con del codice di
 8603 questo tipo:
 8604 
 8605 @example
 8606 if (substr($i, 1, 1) == "\"") @{
 8607     len = length($i)
 8608     $i = substr($i, 2, len - 2) # Ottiene il testo tra doppi apici
 8609 @}
 8610 @end example
 8611 
 8612 @quotation NOTA
 8613 Alcuni programmi esportano dei dati CSV che contengono dei ritorni a capo al
 8614 loro interno in campi rinchiusi tra doppi apici.  @command{gawk} non @`e in
 8615 grado di trattare questi dati.  Malgrado esista una specifica ufficiale
 8616 per i dati CSV, non c'@`e molto da fare; il meccanismo  di @code{FPAT} fornisce
 8617 una soluzione elegante per la maggioranza dei casi, e per gli sviluppatori di
 8618 @command{gawk} ci@`o pu@`o bastare.
 8619 @end quotation
 8620 
 8621 Come visto, l'espressione regolare usata per @code{FPAT} richiede
 8622 che ogni campo contenga almeno un carattere.  Una semplice modifica
 8623 (cambiare il primo @samp{+} con @samp{*}) permette che siano presenti dei
 8624 campi vuoti:
 8625 
 8626 @example
 8627 FPAT = "([^,]*)|(\"[^\"]+\")"
 8628 @end example
 8629 
 8630 @c FIXME: 4/2015
 8631 @c Consider use of FPAT = "([^,]*)|(\"[^\"]*\")"
 8632 @c (star in latter part of value) to allow quoted strings to be empty.
 8633 @c Per email from Ed Morton <mortoneccc@comcast.net>
 8634 
 8635 Come per @code{FS}, la variabile @code{IGNORECASE}
 8636 (@pxref{Variabili modificabili dall'utente}) ha effetto sulla separazione dei
 8637 campi con @code{FPAT}.
 8638 
 8639 Se si assegna un valore a @code{FPAT} la divisione in campi non viene
 8640 effettuata utilizzando @code{FS} o @code{FIELDWIDTHS}.
 8641 
 8642 Infine, la funzione @code{patsplit()} rende la stessa funzionalit@`a disponibile
 8643 per suddividere normali stringhe (@pxref{Funzioni per stringhe}).
 8644 
 8645 @node File CSV
 8646 @subsection Ancora sui file CSV
 8647 
 8648 @cindex Collado, Manuel
 8649 Manuel Collado fa notare che, oltre alle virgole, un campo CSV pu@`o anche
 8650 contenere apici, che devono essere protetti raddoppiandoli.
 8651 Le espressione regolari descritte sopra non sono in grado di accettare
 8652 campi fra apici che contengano al loro interno sia virgole che apici.
 8653 Egli suggerisce che l'espressione pi@`u semplice di @code{FPAT} in grado
 8654 di riconoscere tale tipo di campi @`e @code{/([^,]*)|("([^"]|"")+")/}.
 8655 Egli ha preparato questo input come test per riconoscere queste varianti:
 8656 
 8657 @example
 8658 @c file eg/misc/sample.csv
 8659 p,"q,r",s
 8660 p,"q""r",s
 8661 p,"q,""r",s
 8662 p,"",s
 8663 p,,s
 8664 @c endfile
 8665 @end example
 8666 
 8667 @noindent
 8668 E questo @`e il suo programma di test:
 8669 
 8670 @example
 8671 @c file eg/misc/test-csv.awk
 8672 @group
 8673 BEGIN @{
 8674      fp[0] = "([^,]+)|(\"[^\"]+\")"
 8675      fp[1] = "([^,]*)|(\"[^\"]+\")"
 8676      fp[2] = "([^,]*)|(\"([^\"]|\"\")+\")"
 8677      FPAT = fp[fpat+0]
 8678 @}
 8679 @end group
 8680 
 8681 @group
 8682 @{
 8683      print "<" $0 ">"
 8684      printf("NF = %s ", NF)
 8685      for (i = 1; i <= NF; i++) @{
 8686          printf("<%s>", $i)
 8687      @}
 8688      print ""
 8689 @}
 8690 @end group
 8691 @c endfile
 8692 @end example
 8693 
 8694 Se eseguito usando la terza variante di @code{FPAT},
 8695 il programma produce in output:
 8696 
 8697 @example
 8698 $ @kbd{gawk -v fpat=2 -f test-csv.awk sample.csv}
 8699 @print{} <p,"q,r",s>
 8700 @print{} NF = 3 <p><"q,r"><s>
 8701 @print{} <p,"q""r",s>
 8702 @print{} NF = 3 <p><"q""r"><s>
 8703 @print{} <p,"q,""r",s>
 8704 @print{} NF = 3 <p><"q,""r"><s>
 8705 @print{} <p,"",s>
 8706 @print{} NF = 3 <p><""><s>
 8707 @print{} <p,,s>
 8708 @print{} NF = 3 <p><><s>
 8709 @end example
 8710 
 8711 @node Controllare la creazione di campi
 8712 @section Controllare come @command{gawk} sta dividendo i record
 8713 
 8714 @cindex @command{gawk} @subentry separazione in campi e
 8715 Come visto sopra, @command{gawk} fornisce tre metodi indipendenti per
 8716 dividere i record in input in campi.  Il meccanismo utilizzato dipende da
 8717 quale delle tre variabili --- @code{FS}, @code{FIELDWIDTHS} o
 8718 @code{FPAT} --- @`e stato definito per ultimo.
 8719 Inoltre, un analizzatore di input che utilizzi l'API (Application
 8720 Programming Interface) pu@`o scegliere di modificare il meccanismo di
 8721 analisi dei record; si veda @ref{Analizzatori di input} per ulteriori informazioni
 8722 riguardo a questa funzionalit@`a.
 8723 
 8724 Per ripristinare la normale divisione in campi dopo aver fatto uso
 8725 di @code{FIELDWIDTHS} e/o @code{FPAT}, @`e sufficiente assegnare un valore
 8726 alla variabile @code{FS}.
 8727 Si pu@`o usare @samp{FS = FS} per farlo, senza bisogno di conoscere il
 8728 valore corrente di @code{FS}.
 8729 
 8730 Per determinare quale sia il tipo di divisione dei campi attiva al momento,
 8731 si usi @code{PROCINFO["FS"]} (@pxref{Variabili auto-assegnate}).
 8732 Il valore @`e @code{"FS"} se si usa la maniera normale di divisione dei campi,
 8733 @code{"FIELDWIDTHS"} se si usa la divisione in campi di lunghezza fissa,
 8734 oppure @code{"FPAT"} se si una la divisione in campi in base al contenuto:
 8735 
 8736 @example
 8737 if (PROCINFO["FS"] == "FS")
 8738     @var{divisione normale in campi} @dots{}
 8739 else if (PROCINFO["FS"] == "FIELDWIDTHS")
 8740     @var{divisione in campi a lunghezza fissa} @dots{}
 8741 else if (PROCINFO["FS"] == "FPAT")
 8742     @var{divisione in campi in base al contenuto} @dots{}
 8743 else
 8744     @var{divisione in campi da analizzatore di input API} @dots{}
 8745                                     @ii{(funzionalit@`a avanzata)}
 8746 @end example
 8747 
 8748 Quest'informazione @`e utile se si sta scrivendo una funzione che
 8749 deve cambiare provvisoriamente @code{FS} o @code{FIELDWIDTHS}, leggere alcuni
 8750 record e poi ripristinare le inpostazioni originali.  Si veda
 8751 (@pxref{Funzioni Passwd} per un esempio di una funzione di questo tipo.
 8752 
 8753 @node Righe multiple
 8754 @section Record su righe multiple
 8755 
 8756 @cindex righe multiple @subentry record su
 8757 @cindex record @subentry multiriga
 8758 @cindex input @subentry record multiriga
 8759 @cindex file @subentry lettura dei record multiriga
 8760 @cindex input
 8761 In alcune banche-dati, una sola riga non pu@`o contenere in modo adeguato
 8762 tutte le informazioni di una voce.  In questi casi si possono usare record
 8763 multiriga.
 8764 Il primo passo @`e quello di scegliere il formato dei dati.
 8765 
 8766 @cindex separatore di record @subentry per record multiriga
 8767 Una tecnica @`e quella di usare un carattere o una stringa non usuali per
 8768 separare i record.  Per esempio, si pu@`o usare il carattere di interruzione di
 8769 pagina (scritto @samp{\f} sia in @command{awk} che in C) per separarli,
 8770 rendendo ogni record una pagina del file.  Per far ci@`o, basta impostare la
 8771 variabile @code{RS} a @code{"\f"} (una stringa contenente il carattere di
 8772 interruzione di pagina).  Si potrebbe ugualmente usare qualsiasi altro
 8773 carattere, sempre che non faccia parte dei dati di un record.
 8774 
 8775 @cindex @code{RS} (variabile) @subentry record multiriga e
 8776 Un'altra tecnica @`e quella di usare righe vuote per separare i record.
 8777 Per una particolare
 8778 convenzione, una stringa nulla come valore di @code{RS} indica che i record
 8779 sono separati da una o pi@`u righe vuote.  Quando @code{RS} @`e impostato alla
 8780 stringa nulla, ogni record termina sempre alla prima riga vuota che @`e stata
 8781 trovata.  Il record successivo non inizia prima della successiva riga non
 8782 vuota.  Indipendentemente dal numero di righe vuote presenti in successione,
 8783 esse costituiscono sempre un unico separatore di record.
 8784 (Le righe vuote devono essere completamente vuote; righe che contengono
 8785 spazi bianchi @emph{non} sono righe vuote.)
 8786 
 8787 @cindex stringa @subentry pi@`u lunga da sinistra @subentry individuare la
 8788 @cindex individuare @subentry la stringa pi@`u lunga da sinistra
 8789 Si pu@`o ottenere lo stesso effetto di @samp{RS = ""} assegnando la stringa
 8790 @code{"\n\n+"} a @code{RS}.  Quest'espressione regolare individua
 8791 il ritorno a capo alla fine del record e una o pi@`u righe vuote dopo il
 8792 record.  In aggiunta, un'espressione regolare individua sempre la sequenza pi@`u
 8793 lunga possibile quando una tale stringa sia presente.
 8794 (@pxref{Pi@`u lungo da sinistra}).
 8795 Quindi, il record successivo non inizia prima della successiva riga non
 8796 vuota; indipendentemente dal numero di righe vuote presenti in una voce di
 8797 banca-dati, esse sono considerate come un unico separatore di record.
 8798 
 8799 @cindex angolo buio @subentry record multiriga
 8800 Comunque, c'@`e una sostanziale differenza tra @samp{RS = ""} e @samp{RS =
 8801 "\n\n+"}.  Nel primo caso, i ritorni a capo iniziali nel @value{DF} di
 8802 input vengono ignorati, e se un file termina senza righe vuote aggiuntive dopo
 8803 l'ultimo record, il ritorno a capo viene rimosso dal record.  Nel secondo
 8804 caso, questa particolare elaborazione non viene fatta.
 8805 @value{DARKCORNER}
 8806 
 8807 @cindex separatore di campo @subentry nei record multiriga
 8808 @cindex @code{FS} (variabile) @subentry nei record multiriga
 8809 Ora che l'input @`e separato in record, il secondo passo @`e quello di separare i
 8810 campi all'interno dei record.  Un modo per farlo @`e quello di dividere in
 8811 campi ognuna delle righe in input
 8812 nel modo solito.  Questo viene fatto per default tramite una
 8813 speciale funzionalit@`a.  Quando @code{RS} @`e impostato alla stringa nulla
 8814 @emph{e} @code{FS} @`e impostato a un solo carattere, il carattere di
 8815 ritorno a capo agisce @emph{sempre} come separatore di campo.
 8816 Questo in aggiunta a tutte le separazioni di campo che risultano da
 8817 @code{FS}.
 8818 
 8819 @quotation NOTA
 8820 Quando @code{FS} @`e la stringa nulla (@code{""}), o
 8821 un'espressione regolare, questa particolare funzionalit@`a di @code{RS} non
 8822 viene applicata; si applica al separatore di campo di default,
 8823 che @`e costituito da un solo spazio:
 8824 @samp{FS = @w{" "}}.
 8825 
 8826 Si noti che la formulazione della specifica POSIX implica che
 8827 questa particolare funzionalit@`a dovrebbe valere anche quando
 8828 @code{FS} sia un'espressione regolare.
 8829 Tuttavia, Unix @command{awk} non si @`e mai comportato in questo
 8830 modo, e neppure @command{gawk}.  Questo @`e fondamentalmente
 8831 un errore nella specifica POSIX.
 8832 @c Noted as of 4/2019; working to get the standard fixed.
 8833 @end quotation
 8834 
 8835 La motivazione originale per questa particolare eccezione probabilmente era
 8836 quella di prevedere un comportamento che fosse utile nel caso di default
 8837 (cio@`e, @code{FS} uguale a @w{@code{" "}}).  Questa funzionalit@`a pu@`o
 8838 costituire un problema se non si vuole che il carattere di ritorno a capo
 8839 faccia da separatore tra i campi, perch@'e non c'@`e alcun modo per impedirlo.
 8840 Tuttavia, si pu@`o aggirare il problema usando la funzione @code{split()}
 8841 per spezzare i record manualmente.
 8842 (@pxref{Funzioni per stringhe}).
 8843 Se si ha un separatore di campo costituito da un solo carattere, si pu@`o
 8844 aggirare la funzionalit@`a speciale in modo diverso, trasformando @code{FS}
 8845 in un'espressione regolare contenente
 8846 quel carattere singolo.  Per esempio, se il separatore di campo @`e
 8847 un carattere di percentuale, al posto di
 8848 @samp{FS = "%"}, si pu@`o usare @samp{FS = "[%]"}.
 8849 
 8850 Un altro modo per separare i campi @`e quello di
 8851 mettere ciascun campo su una riga separata: per far questo basta impostare la
 8852 variabile @code{FS} alla stringa @code{"\n"}.
 8853 (Questo separatore di un solo carattere individua un singolo ritorno a capo.)
 8854 Un esempio pratico di un @value{DF} organizzato in questo modo potrebbe essere
 8855 un elenco di indirizzi, in cui delle righe vuote fungono da separatore fra
 8856 record.  Si consideri un elenco di indirizzi in un file chiamato
 8857 @file{indirizzi}, simile a questo:
 8858 
 8859 @example
 8860 Jane Doe
 8861 123 Main Street
 8862 Anywhere, SE 12345-6789
 8863 
 8864 John Smith
 8865 456 Tree-lined Avenue
 8866 Smallville, MW 98765-4321
 8867 @dots{}
 8868 @end example
 8869 
 8870 @noindent
 8871 Un semplice programma per elaborare questo file @`e il seguente:
 8872 
 8873 @example
 8874 # addrs.awk --- semplice programma per una lista di indirizzi postali
 8875 
 8876 # I record sono separati da righe bianche
 8877 # Ogni riga @`e un campo.
 8878 BEGIN @{ RS = "" ; FS = "\n" @}
 8879 
 8880 @{
 8881       print "Il nome @`e:", $1
 8882       print "L'indirizzo @`e:", $2
 8883       print "Citt@`a e Stato sono:", $3
 8884       print ""
 8885 @}
 8886 @end example
 8887 
 8888 L'esecuzione del programma produce questo output:
 8889 
 8890 @example
 8891 $ @kbd{awk -f addrs.awk addresses}
 8892 @print{} Il nome @`e: Jane Doe
 8893 @print{} L'indirizzo @`e: 123 Main Street
 8894 @print{} Citt@`a e Stato sono: Anywhere, SE 12345-6789
 8895 @print{}
 8896 @print{} Il nome @`e: John Smith
 8897 @print{} L'indirizzo @`e: 456 Tree-lined Avenue
 8898 @print{} Citt@`a e Stato sono: Smallville, MW 98765-4321
 8899 @print{}
 8900 @dots{}
 8901 @end example
 8902 
 8903 @xref{Programma labels}, per un programma pi@`u realistico per gestire
 8904 elenchi di indirizzi.  Il seguente elenco riassume come sono divisi i record,
 8905 a seconda del valore assunto da
 8906 @ifinfo
 8907 @code{RS}.
 8908 (@samp{==} significa ``@`e uguale a.'')
 8909 @end ifinfo
 8910 @ifnotinfo
 8911 @code{RS}:
 8912 @end ifnotinfo
 8913 
 8914 @table @code
 8915 @item RS == "\n"
 8916 I record sono separati dal carattere di ritorno a capo (@samp{\n}).  In
 8917 effetti, ogni riga nel @value{DF} @`e un record separato, comprese le righe
 8918 vuote.  Questo @`e il comportamento di default.
 8919 
 8920 @item RS == @var{qualsiasi carattere singolo}
 8921 I record sono separati da ogni ricorrenza del carattere specificato.  Pi@`u
 8922 ricorrenze adiacenti delimitano record vuoti.
 8923 
 8924 @item RS == ""
 8925 I record sono separati da una o pi@`u righe vuote.
 8926 Quando @code{FS} @`e un carattere singolo,
 8927 il carattere di ritorno a capo
 8928 serve sempre come separatore di campo, in aggiunta a qualunque valore possa
 8929 avere @code{FS}.  I ritorni a capo all'inizio e alla fine del file sono
 8930 ignorati.
 8931 
 8932 @item RS == @var{regexp}
 8933 I record sono separati da ricorrenze di caratteri corrispondenti a
 8934 @var{regexp}.  Le corrispondenze iniziali e finali di
 8935 @var{regexp} designano record vuoti.
 8936 (Questa @`e un'estensione di @command{gawk}; non @`e specificata dallo
 8937 standard POSIX.)
 8938 @end table
 8939 
 8940 @cindex @command{gawk} @subentry variabile @subentry @code{RT} in
 8941 @cindex @code{RT} (variabile)
 8942 @cindex differenze tra @command{awk} e @command{gawk} @subentry variabili @code{RS}/@code{RT}
 8943 Se non @`e eseguito in modalit@`a di compatibilit@`a (@pxref{Opzioni}),
 8944 @command{gawk} imposta @code{RT} al testo di input corrispondente
 8945 al valore specificato da @code{RS}.
 8946 Ma se al termine del file in input non @`e stato trovato un testo che
 8947 corrisponde a @code{RS}, @command{gawk} imposta @code{RT} alla stringa nulla.
 8948 
 8949 @node Getline
 8950 @section Richiedere input usando @code{getline}
 8951 
 8952 @cindex @code{getline} (comando) @subentry input esplicito con
 8953 @cindex input @subentry esplicito
 8954 Finora abbiamo ottenuto i dati di input dal flusso di input principale di
 8955 @command{awk}: lo standard input (normalmente la tastiera, a volte
 8956 l'output di un altro programma) o i
 8957 file indicati sulla riga di comando.  Il linguaggio @command{awk} ha uno
 8958 speciale comando predefinito chiamato @code{getline} che
 8959 pu@`o essere usato per leggere l'input sotto il diretto controllo dell'utente.
 8960 
 8961 Il comando @code{getline} @`e usato in molti modi diversi e
 8962 @emph{non} dovrebbe essere usato dai principianti.
 8963 L'esempio che segue alla spiegazione del comando @code{getline}
 8964 comprende del materiale che ancora non @`e stato trattato.  Quindi, @`e meglio
 8965 tornare indietro e studiare il comando @code{getline} @emph{dopo} aver rivisto
 8966 il resto
 8967 @ifinfo
 8968 di questo @value{DOCUMENT}
 8969 @end ifinfo
 8970 @ifhtml
 8971 di questo @value{DOCUMENT}
 8972 @end ifhtml
 8973 @ifnotinfo
 8974 @ifnothtml
 8975 delle Parti I e II
 8976 @end ifnothtml
 8977 @end ifnotinfo
 8978 e avere acquisito una buona conoscenza di come funziona @command{awk}.
 8979 
 8980 @cindex @command{gawk} @subentry variabile @subentry @code{ERRNO} in
 8981 @cindex @code{ERRNO} (variabile) @subentry con comando @command{getline}
 8982 @cindex differenze tra @command{awk} e @command{gawk} @subentry comando @code{getline}
 8983 @cindex @code{getline} (comando) @subentry codice di ritorno
 8984 @cindex @option{--sandbox} (opzione) @subentry ridirezione dell'input con @code{getline}
 8985 @cindex opzione @subentry @option{--sandbox} @subentry ridirezione dell'input con @code{getline}
 8986 
 8987 Il comando @code{getline} restituisce 1 se trova un record e 0 se
 8988 trova la fine del file.  Se si verifica qualche errore cercando di leggere
 8989 un record, come un file che non pu@`o essere aperto, @code{getline}
 8990 restituisce @minus{}1.  In questo caso, @command{gawk} imposta la variabile
 8991 @code{ERRNO} a una stringa che descrive l'errore in questione.
 8992 
 8993 Se il messaggio di errore @code{ERRNO} indica che l'operazione di I/O pu@`o
 8994 essere ritentata e la variabile @code{PROCINFO["@var{input}", "RETRY"]} @`e
 8995 impostata a 1, @code{getline} restituisce un codice di ritorno @minus{}2
 8996 invece che @minus{}1, e si pu@`o provare a chiamare ulterioriormente
 8997 @code{getline}.  @xref{Proseguire dopo errore in input} per ulteriori
 8998 informazioni riguardo a questa funzionalit@`a.
 8999 
 9000 Negli esempi seguenti, @var{comando} sta per un valore di stringa che
 9001 rappresenta un comando della shell.
 9002 
 9003 @quotation NOTA
 9004 Quando @`e stata specificata l'opzione @option{--sandbox} (@pxref{Opzioni}),
 9005 la lettura di input da file, @dfn{pipe} e coprocessi non @`e possibile.
 9006 @end quotation
 9007 
 9008 @menu
 9009 * Getline semplice::             Usare @code{getline} senza argomenti.
 9010 * Getline variabile::            Usare @code{getline} in una variabile.
 9011 * Getline file::                 Usare @code{getline} da un file.
 9012 * Getline variabile file::       Usare @code{getline} in una variabile da un
 9013                                  file.
 9014 * Getline @dfn{pipe}::           Usare @code{getline} da una @dfn{pipe}.
 9015 * Getline variabile @dfn{pipe}:: Usare @code{getline} in una variabile da una
 9016                                  @dfn{pipe}.
 9017 * Getline coprocesso::           Usare @code{getline} da un coprocesso.
 9018 * Getline variabile coprocesso:: Usare @code{getline} in una variabile da un
 9019                                  coprocesso.
 9020 * Note su getline::              Cose importanti da sapere su @code{getline}.
 9021 * Sommario di getline::          Sommario delle varianti di @code{getline}.
 9022 @end menu
 9023 
 9024 @node Getline semplice
 9025 @subsection Usare @code{getline} senza argomenti
 9026 
 9027 Il comando @code{getline} pu@`o essere usato senza argomenti per leggere l'input
 9028 dal file in input corrente.  Tutto quel che fa in questo caso @`e leggere il
 9029 record in input successivo e dividerlo in campi.  Questo @`e utile se @`e
 9030 finita l'elaborarezione del record corrente, e si vogliono fare delle
 9031 elaborazioni particolari sul record successivo @emph{proprio adesso}.
 9032 Per esempio:
 9033 
 9034 @c 6/2019: Thanks to Mark Krauze <daburashka@ya.ru> for suggested
 9035 @c improvements (the inner while loop).
 9036 @example
 9037 # rimuovere il testo tra /* e */, compresi
 9038 @{
 9039     while ((inizio = index($0, "/*")) != 0) @{
 9040         prima = substr($0, 1, inizio - 1)  # parte iniziale della stringa
 9041         dopo = substr($0, inizio + 2)    # ... */ ...    
 9042         while ((fine = index(dopo, "*/")) == 0) @{  # */ @`e nella parte finale?
 9043             # passa ai record seguenti
 9044             if (getline <= 0) @{
 9045                 print("Fine file inattesa o errore:", ERRNO) > "/dev/stderr"
 9046                 exit
 9047             @}
 9048             # costruisce la riga usando la concatenazione di stringhe
 9049             dopo = dopo $0
 9050       @}
 9051       dopo = substr(dopo, fine + 2)  # rimuove il commento
 9052       # costruisce la riga di output usando la concatenazione
 9053       # di stringhe
 9054       $0 = prima dopo
 9055   @}
 9056   print $0
 9057 @}
 9058 @end example
 9059 
 9060 Questo programma @command{awk} cancella i commenti in stile C
 9061 (@samp{/* @dots{} */}) dall'input.
 9062 Usa diverse funzionalit@`a che non sono ancora state trattate, incluse la
 9063 concatenazione di stringhe
 9064 (@pxref{Concatenazione})
 9065 e le funzioni predefinite @code{index()} e @code{substr()}
 9066 (@pxref{Funzioni per stringhe}).
 9067 Sostituendo @samp{print $0} con altre
 9068 istruzioni, si possono effettuare elaborazioni pi@`u complesse sull'input
 9069 decommentato, come ricercare corrispondenze di un'espressione regolare.
 9070 
 9071 Ecco un esempio di file in input:
 9072 
 9073 @example
 9074 mon/*comment*/key
 9075 rab/*commen
 9076 t*/bit
 9077 horse /*comment*/more text
 9078 part 1 /*comment*/part 2 /*comment*/part 3
 9079 no comment
 9080 @end example
 9081 
 9082 Quando lo si esegue, l'output @`e:
 9083 
 9084 @example
 9085 $ @kbd{awk -f strip_comments.awk example_text}
 9086 @print{} monkey
 9087 @print{} rabbit
 9088 @print{} horse more text
 9089 @print{} part 1 part 2 part 3
 9090 @print{} no comment
 9091 @end example
 9092 
 9093 Questa forma del comando @code{getline} imposta @code{NF},
 9094 @code{NR}, @code{FNR}, @code{RT} e il valore di @code{$0}.
 9095 
 9096 @quotation NOTA
 9097 Il nuovo valore di @code{$0} @`e usato per verificare
 9098 le espressioni di ricerca di ogni regola successiva.  Il valore originale
 9099 di @code{$0} che ha attivato la regola che ha eseguito la @code{getline}
 9100 viene perso.
 9101 A differenza di @code{getline}, l'istruzione @code{next} legge un nuovo record
 9102 ma inizia a elaborarlo normalmente, a partire dalla prima
 9103 regola presente nel programma.  @xref{Istruzione next}.
 9104 @end quotation
 9105 
 9106 @node Getline variabile
 9107 @subsection Usare @code{getline} in una variabile
 9108 @cindex @code{getline} (comando) @subentry in una variabile
 9109 @cindex variabili @subentry usare in comando @code{getline}
 9110 
 9111 Si pu@`o usare @samp{getline @var{var}} per leggere il record successivo
 9112 in input ad @command{awk} nella variabile @var{var}.  Non vien fatta
 9113 nessun'altra elaborazione.
 9114 Per esempio, supponiamo che la riga successiva sia un commento o una stringa
 9115 particolare, e la si voglia leggere senza innescare nessuna regola.  Questa
 9116 forma di @code{getline} permette di leggere quella riga e memorizzarla in una
 9117 variabile in modo che il ciclo principale di @command{awk} che "legge una riga
 9118 e controlla ogni regola" non la veda affatto.
 9119 L'esempio seguente inverte tra loro a due a due le righe in input:
 9120 
 9121 @example
 9122 @group
 9123 @{
 9124      if ((getline tmp) > 0) @{
 9125           print tmp
 9126           print $0
 9127      @} else
 9128           print $0
 9129 @}
 9130 @end group
 9131 @end example
 9132 
 9133 @noindent
 9134 Prende la seguente lista:
 9135 
 9136 @example
 9137 wan
 9138 tew
 9139 free
 9140 phore
 9141 @end example
 9142 
 9143 @noindent
 9144 e produce questo risultato:
 9145 
 9146 @example
 9147 tew
 9148 wan
 9149 phore
 9150 free
 9151 @end example
 9152 
 9153 Il comando @code{getline} usato in questo modo imposta solo le variabili
 9154 @code{NR}, @code{FNR} e @code{RT} (e, naturalmente, @var{var}).
 9155 Il record non viene
 9156 suddiviso in campi, e quindi i valori dei campi (compreso @code{$0}) e
 9157 il valore di @code{NF} non cambiano.
 9158 
 9159 @node Getline file
 9160 @subsection Usare @code{getline} da un file
 9161 
 9162 @cindex @code{getline} (comando) @subentry da un file
 9163 @cindex input @subentry ridirezione dell'
 9164 @cindex ridirezione dell'input
 9165 @cindex @code{<} (parentesi acuta sinistra) @subentry operatore @code{<} (I/O)
 9166 @cindex parentesi @subentry acuta sinistra (@code{<}) @subentry operatore @code{<} (I/O)
 9167 @cindex operatori @subentry input/output
 9168 Si usa @samp{getline < @var{file}} per leggere il record successivo da
 9169 @var{file}.  Qui, @var{file} @`e un'espressione di tipo stringa che
 9170 specifica il @value{FN}.  @samp{< @var{file}} @`e una cosidetta
 9171 @dfn{ridirezione} perch@'e richiede che l'input provenga da un posto
 9172 differente.  Per esempio, il seguente programma
 9173 legge il suo record in input dal file @file{secondary.input} quando
 9174 trova un primo campo con un valore uguale a 10 nel file in input
 9175 corrente:
 9176 
 9177 @example
 9178 @{
 9179     if ($1 == 10) @{
 9180          getline < "secondary.input"
 9181          print
 9182     @} else
 9183          print
 9184 @}
 9185 @end example
 9186 
 9187 Poich@'e non viene usato il flusso principale di input, i valori di @code{NR} e
 9188 @code{FNR} restano immutati.  Comunque, il record in input viene diviso in
 9189 modo normale, per cui vengono cambiati i valori di @code{$0} e degli altri
 9190 campi, producendo un nuovo valore di @code{NF}.
 9191 Viene impostato anche @code{RT}.
 9192 
 9193 @cindex POSIX @command{awk} @subentry @code{<} (operatore)
 9194 @c Thanks to Paul Eggert for initial wording here
 9195 Per lo standard POSIX, @samp{getline < @var{espressione}} @`e ambiguo se
 9196 @var{espressione} contiene operatori che non sono all'interno di parentesi,
 9197 ad esclusione di @samp{$}; per esempio, @samp{getline < dir "/" file} @`e
 9198 ambiguo perch@'e l'operatore di concatenazione (non ancora trattato;
 9199 @pxref{Concatenazione}) non @`e posto tra parentesi.
 9200 Si dovrebbe scrivere invece @samp{getline < (dir "/" file)}, se il
 9201 programma dev'essere portabile su tutte le implementazioni di @command{awk}.
 9202 
 9203 @node Getline variabile file
 9204 @subsection Usare @code{getline} in una variabile da un file
 9205 @cindex variabili @subentry usare in comando @code{getline}
 9206 
 9207 Si usa @samp{getline @var{var} < @var{file}} per leggere l'input
 9208 dal file
 9209 @var{file}, e metterlo nella variabile @var{var}.  Come prima, @var{file}
 9210 @`e un'espressione di tipo stringa che specifica il file dal quale
 9211 legggere.
 9212 
 9213 In questa versione di @code{getline}, nessuna delle variabili predefinite @`e
 9214 cambiata e il record non @`e diviso in campi.  La sola variabile cambiata @`e
 9215 @var{var}.@footnote{Questo non @`e completamente vero. @code{RT} pu@`o essere
 9216 cambiato se @code{RS} @`e un'espressione regolare.}
 9217 Per esempio, il seguente programma copia tutti i file in input nell'output, ad
 9218 eccezione dei record che dicono @w{@samp{@@include @var{nomefile}}}.
 9219 Tale record @`e sostituito dal contenuto del file
 9220 @var{nomefile}:
 9221 
 9222 @example
 9223 @{
 9224      if (NF == 2 && $1 == "@@include") @{
 9225           while ((getline line < $2) > 0)
 9226                print line
 9227           close($2)
 9228      @} else
 9229           print
 9230 @}
 9231 @end example
 9232 
 9233 Si noti come il nome del file in input aggiuntivo non compaia all'interno del
 9234 programma; @`e preso direttamente dai dati, e precisamente dal secondo campo
 9235 della riga di @code{@@include}.
 9236 
 9237 La funzione @code{close()} viene chiamata per assicurarsi che se nell'input
 9238 appaiono due righe @code{@@include} identiche, l'intero file specificato sia
 9239 incluso ogni volta.
 9240 @xref{Chiusura file e @dfn{pipe}}.
 9241 
 9242 Una carenza di questo programma @`e che non gestisce istruzioni
 9243 @code{@@include} nidificate
 9244 (cio@`e, istruzioni @code{@@include} contenute nei file inclusi)
 9245 nel modo in cui ci si aspetta che funzioni un vero preelaboratore di macro.
 9246 @xref{Programma igawk} per un programma
 9247 che gestisce le istruzioni @code{@@include} nidificate.
 9248 
 9249 @node Getline @dfn{pipe}
 9250 @subsection Usare @code{getline} da una @dfn{pipe}
 9251 
 9252 @c From private email, dated October 2, 1988. Used by permission, March 2013.
 9253 @cindex Kernighan, Brian
 9254 @quotation
 9255 @i{L'onniscienza ha molti aspetti positivi.
 9256 Se non si pu@`o ottenerla, l'attenzione ai dettagli pu@`o aiutare.}
 9257 @author Brian Kernighan
 9258 @end quotation
 9259 
 9260 @cindex @code{|} (barra verticale) @subentry operatore @code{|} (I/O)
 9261 @cindex barra verticale (@code{|}) @subentry operatore @code{|} (I/O)
 9262 @cindex input @subentry @dfn{pipeline}
 9263 @cindex @dfn{pipe} @subentry input
 9264 @cindex operatori @subentry input/output
 9265 L'output di un comando pu@`o anche essere convogliato in @code{getline}, usando
 9266 @samp{@var{comando} | getline}.  In
 9267 questo caso, la stringa @var{comando} viene eseguita come comando di shell e
 9268 il suo output @`e passato ad @command{awk} per essere usato come input.
 9269 Questa forma di @code{getline} legge un record alla volta dalla @dfn{pipe}.
 9270 Per esempio, il seguente programma copia il suo input nel suo output,
 9271 ad eccezione delle righe che iniziano con @samp{@@execute}, che sono
 9272 sostituite dall'output prodotto dall'esecuzione del resto della riga
 9273 costituito da un comando di shell.
 9274 
 9275 @example
 9276 @group
 9277 @{
 9278      if ($1 == "@@execute") @{
 9279           tmp = substr($0, 10)        # Rimuove "@@execute"
 9280           while ((tmp | getline) > 0)
 9281                print
 9282           close(tmp)
 9283      @} else
 9284           print
 9285 @}
 9286 @end group
 9287 @end example
 9288 
 9289 @noindent
 9290 La funzione @code{close()} viene chiamata per assicurarsi che, se appaiono
 9291 nell'input due righe @samp{@@execute} identiche, il comando sia eseguito per
 9292 ciascuna di esse.
 9293 @ifnottex
 9294 @ifnotdocbook
 9295 @xref{Chiusura file e @dfn{pipe}}.
 9296 @end ifnotdocbook
 9297 @end ifnottex
 9298 @c This example is unrealistic, since you could just use system
 9299 Dato l'input:
 9300 
 9301 @example
 9302 pippo
 9303 pluto
 9304 paperino
 9305 @@execute who
 9306 gastone
 9307 @end example
 9308 
 9309 @noindent
 9310 il programma potrebbe produrre:
 9311 
 9312 @cindex Robbins @subentry Bill
 9313 @cindex Robbins @subentry Miriam
 9314 @cindex Robbins @subentry Arnold
 9315 @example
 9316 pippo
 9317 pluto
 9318 paperino
 9319 arnold     ttyv0   Jul 13 14:22
 9320 miriam     ttyp0   Jul 13 14:23     (murphy:0)
 9321 bill       ttyp1   Jul 13 14:23     (murphy:0)
 9322 gastone
 9323 @end example
 9324 
 9325 @noindent
 9326 Si osservi che questo programma ha eseguito @command{who} e stampato il
 9327 risultato.  (Eseguendo questo programma, @`e chiaro che ciascun utente otterr@`a
 9328 risultati diversi, a seconda di chi @`e collegato al sistema.)
 9329 
 9330 Questa variante di @code{getline} divide il record in campi, imposta il valore
 9331 di @code{NF}, e ricalcola il valore di @code{$0}.  I valori di
 9332 @code{NR} e @code{FNR} non vengono cambiati.
 9333 Viene impostato @code{RT}.
 9334 
 9335 @cindex POSIX @command{awk} @subentry @code{|} (operatore I/O)
 9336 @c Thanks to Paul Eggert for initial wording here
 9337 Per lo standard POSIX, @samp{@var{espressione} | getline} @`e ambiguo se
 9338 @var{espressione} contiene operatori che non sono all'interno di parentesi,
 9339 ad esclusione di @samp{$}. Per esempio,
 9340 @samp{@w{"echo "} "date" | getline} @`e ambiguo perch@'e
 9341 l'operatore di concatenazione non @`e tra parentesi.  Si dovrebbe scrivere
 9342 invece @samp{(@w{"echo "} "date") | getline}, se il programma dev'essere
 9343 portabile su tutte le implementazioni di @command{awk}.
 9344 
 9345 @cindex Brian Kernighan @subentry @command{awk} di
 9346 @cindex @command{mawk} (programma di utilit@`a)
 9347 @cindex programma di utilit@`a @subentry @command{mawk}
 9348 @quotation NOTA
 9349 Sfortunatamente, @command{gawk} non ha un comportamento uniforme nel
 9350 trattare un costrutto come @samp{@w{"echo "} "date" | getline}.
 9351 La maggior parte delle versioni, compresa la versione corrente, lo tratta
 9352 come @samp{@w{("echo "} "date") | getline}.
 9353 (Questo @`e anche il comportamento di BWK @command{awk}.)
 9354 Alcune versioni invece lo trattano come
 9355 @samp{@w{"echo "} ("date" | getline)}.
 9356 (Questo @`e il comportamento di @command{mawk}.)
 9357 In breve, per evitare problemi, @`e @emph{sempre} meglio usare parentesi
 9358 esplicite.
 9359 @end quotation
 9360 
 9361 @node Getline variabile @dfn{pipe}
 9362 @subsection Usare @code{getline} in una variabile da una @dfn{pipe}
 9363 @cindex variabili @subentry usare in comando @code{getline}
 9364 
 9365 Quando si usa @samp{@var{comando} | getline @var{var}},
 9366 l'output di @var{comando} @`e inviato tramite una @dfn{pipe} a
 9367 @code{getline} ad una variabile @var{var}.  Per esempio, il
 9368 seguente programma legge la data e l'ora corrente nella variabile
 9369 @code{current_time}, usando il programma di utilit@`a @command{date}, e poi lo
 9370 stampa:
 9371 
 9372 @example
 9373 BEGIN @{
 9374      "date" | getline current_time
 9375      close("date")
 9376      print "Report printed on " current_time
 9377 @}
 9378 @end example
 9379 
 9380 In questa versione di @code{getline}, nessuna delle variabili predefinite @`e
 9381 cambiata e il record non @`e diviso in campi.  In ogni caso, @code{RT} viene
 9382 impostato.
 9383 
 9384 @ifinfo
 9385 @c Thanks to Paul Eggert for initial wording here
 9386 Per lo standard POSIX, @samp{@var{espressione} | getline @var{var}} @`e ambiguo
 9387 se @var{espressione} contiene operatori che non sono all'interno di parentesi
 9388 ad esclusione di @samp{$}; per esempio,
 9389 @samp{@w{"echo "} "date" | getline @var{var}} @`e ambiguo
 9390 perch@'e l'operatore di concatenazione non @`e tra parentesi.  Si dovrebbe
 9391 scrivere invece @samp{(@w{"echo "} "date") | getline @var{var}} se il
 9392 programma dev'essere portabile su tutte le implementazioni di @command{awk}.
 9393 @end ifinfo
 9394 
 9395 @node Getline coprocesso
 9396 @subsection Usare @code{getline} da un coprocesso
 9397 @cindex coprocessi @subentry @code{getline} da
 9398 @cindex @code{getline} (comando) @subentry coprocessi, usare da
 9399 @cindex @code{|} (barra verticale) @subentry operatore @code{|&} (I/O)
 9400 @cindex barra verticale (@code{|}) @subentry operatore @code{|&} (I/O)
 9401 @cindex operatori @subentry input/output
 9402 @cindex differenze tra @command{awk} e @command{gawk} @subentry operatori di input/output
 9403 
 9404 Leggere dell'input in @code{getline} da una @dfn{pipe} @`e un'operazione
 9405 unidirezionale.
 9406 Il comando avviato con @samp{@var{comando} | getline} invia dati
 9407 @emph{al} programma @command{awk}.
 9408 
 9409 Occasionalmente, si potrebbe avere la necessit@`a di inviare dei dati a un altro
 9410 programma che li elabori, per poi leggere il risultato che esso genera.
 9411 @command{gawk} permette di avviare un @dfn{coprocesso}, col quale sono
 9412 possibili comunicazioni bidirezionali.  Questo vien fatto con l'operatore
 9413 @samp{|&}.
 9414 Tipicamente, dapprima si inviano dati al coprocesso e poi si leggono
 9415 i risultati da esso prodotto, come mostrato di seguito:
 9416 
 9417 @example
 9418 print "@var{some query}" |& "db_server"
 9419 "db_server" |& getline
 9420 @end example
 9421 
 9422 @noindent
 9423 esso invia una richiesta a @command{db_server} e poi legge i risultati.
 9424 
 9425 I valori di @code{NR} e
 9426 @code{FNR} non vengono cambiati,
 9427 perch@'e non @`e cambiato il flusso principale.
 9428 In ogni caso, il record @`e diviso in campi
 9429 nel solito modo, cambiando cos@`{@dotless{i}} i valori di @code{$0}, degli altri campi,
 9430 e di @code{NF} e @code{RT}.
 9431 
 9432 I coprocessi sono una funzionalit@`a avanzata.  Vengono trattati qui solo perch@'e
 9433 @ifnotinfo
 9434 questa @`e la
 9435 @end ifnotinfo
 9436 @ifinfo
 9437 questo @`e il
 9438 @end ifinfo
 9439 @value{SECTION} su @code{getline}.
 9440 @xref{I/O bidirezionale},
 9441 dove i coprocessi vengono trattati pi@`u dettagliatamente.
 9442 
 9443 @node Getline variabile coprocesso
 9444 @subsection Usare @code{getline} in una variabile da un coprocesso
 9445 @cindex variabili @subentry usare in comando @code{getline}
 9446 
 9447 Quando si usa @samp{@var{comando} |& getline @var{var}}, l'output dal
 9448 coprocesso @var{comando} viene inviato tramite una @dfn{pipe} bidirezionale a
 9449 @code{getline} e nella variabile @var{var}.
 9450 
 9451 In questa versione di @code{getline}, nessuna delle variabili predefinite
 9452 viene cambiata e il record non viene diviso in campi.  La sola variabile che
 9453 cambia @`e @var{var}.
 9454 In ogni caso, @code{RT} viene impostato.
 9455 
 9456 @ifinfo
 9457 I coprocessi sono una funzionalit@`a avanzata.  Vengono trattati qui solo perch@'e
 9458 questo @`e il @value{SECTION} su @code{getline}.
 9459 @xref{I/O bidirezionale},
 9460 dove i coprocessi vengono trattati pi@`u dettagliatamente.
 9461 @end ifinfo
 9462 
 9463 @node Note su getline
 9464 @subsection Cose importanti da sapere riguardo a @code{getline}
 9465 Qui sono elencate diverse considerazioni su @code{getline}
 9466 da tener presenti:
 9467 
 9468 @itemize @value{BULLET}
 9469 @item
 9470 Quando @code{getline} cambia il valore di @code{$0} e @code{NF},
 9471 @command{awk} @emph{non} salta automaticamente all'inizio del
 9472 programma per iniziare a provare il nuovo record su ogni criterio di ricerca.
 9473 Comunque, il nuovo record viene provato su ogni regola successiva.
 9474 
 9475 @cindex differenze tra @command{awk} e @command{gawk} @subentry limitazioni di implementazione
 9476 @cindex implementazione @subentry problemi di @subentry @command{gawk}, limiti
 9477 @cindex @command{awk} @subentry implementazioni di @subentry limiti delle
 9478 @cindex @command{gawk} @subentry problemi di implementazione @subentry limiti
 9479 @item
 9480 Alcune tra le prime implementazioni di @command{awk} limitano a una sola il
 9481 numero di @dfn{pipeline} che un programma @command{awk} pu@`o tenere aperte.
 9482 In @command{gawk}, non c'@`e questo limite.
 9483 Si possono aprire tante @dfn{pipeline} (e coprocessi) quante ne permette il
 9484 sistema operativo in uso.
 9485 
 9486 @cindex effetti collaterali @subentry variabile @code{FILENAME}
 9487 @cindex @code{FILENAME} (variabile) @subentry impostare con @code{getline}
 9488 @cindex angolo buio @subentry variabile @subentry @code{FILENAME}
 9489 @cindex @code{getline} (comando) @subentry variabile @code{FILENAME} e
 9490 @cindex @code{BEGIN} (regola) @subentry @code{getline} e
 9491 @item
 9492 Un interessante effetto collaterale si ha se si usa @code{getline}, senza
 9493 una ridirezione, all'interno di una regola @code{BEGIN}.  Poich@'e una
 9494 @code{getline} non ridiretta legge dai @value{DF} specificati nella riga di
 9495 comando, il primo comando @code{getline} fa s@`{@dotless{i}} che @command{awk} imposti
 9496 il valore di @code{FILENAME}.  Normalmente, @code{FILENAME} non ha ancora un
 9497 valore all'interno delle regole @code{BEGIN}, perch@'e non si @`e ancora
 9498 iniziato a elaborare il
 9499 @value{DF} della riga di comando.
 9500 @value{DARKCORNER}
 9501 (Si veda @ref{BEGIN/END};
 9502 e @pxref{Variabili auto-assegnate}.)
 9503 
 9504 @item
 9505 Usare @code{FILENAME} con @code{getline}
 9506 (@samp{getline < FILENAME})
 9507 pu@`o essere fonte di
 9508 confusione.  @command{awk} apre un flusso separato di input, diverso dal
 9509 file in input corrente.  Comunque, poich@'e non si usa una variabile,
 9510 @code{$0} e @code{NF} vengono aggiornati.  Se si sta facendo questo, @`e
 9511 probabilmente per sbaglio, e si dovrebbe rivedere quello che si sta cercando
 9512 di fare.
 9513 
 9514 @item
 9515 @ifdocbook
 9516 La prossima @value{SECTION}
 9517 @end ifdocbook
 9518 @ifnotdocbook
 9519 @ref{Sommario di getline},
 9520 @end ifnotdocbook
 9521 contiene una tabella che sintetizza le
 9522 varianti di @code{getline} e le variabili da esse modificate.
 9523 @`E degno di nota che le varianti che non usano la ridirezione
 9524 possono far s@`{@dotless{i}} che @code{FILENAME} venga aggiornato se chiedono ad
 9525 @command{awk} di iniziare a leggere un nuovo file in input.
 9526 
 9527 @item
 9528 @cindex Moore, Duncan
 9529 Se la variabile assegnata @`e un'espressione con effetti collaterali, versioni
 9530 differenti di @command{awk} si comportano in modo diverso quando trovano la
 9531 fine-del-file [EOF].  Alcune versioni non valutano l'espressione; molte
 9532 versioni (compreso @command{gawk}) lo fanno.  Si veda un esempio, gentilmente
 9533 fornito da Duncan Moore:
 9534 
 9535 @ignore
 9536 Date: Sun, 01 Apr 2012 11:49:33 +0100
 9537 From: Duncan Moore <duncan.moore@@gmx.com>
 9538 @end ignore
 9539 
 9540 @example
 9541 BEGIN @{
 9542     system("echo 1 > f")
 9543     while ((getline a[++c] < "f") > 0) @{ @}
 9544     print c
 9545 @}
 9546 @end example
 9547 
 9548 @noindent
 9549 Qui l'effetto secondario @`e @samp{++c}.  Se viene trovata la fine del file
 9550 @emph{prima} di assegnare l'elemento @code{a}, @code{c} @`e incrementato o no?
 9551 
 9552 @command{gawk} tratta @code{getline} come una chiamata di funzione, e valuta
 9553 l'espressione @samp{a[++c]} prima di cercare di leggere da @file{f}.
 9554 Comunque, alcune versioni di @command{awk} valutano l'espressione solo
 9555 se c'@`e un valore di stringa da assegnare.
 9556 @end itemize
 9557 
 9558 @node Sommario di getline
 9559 @subsection Sommario delle varianti di @code{getline}
 9560 @cindex @code{getline} (comando) @subentry varianti
 9561 
 9562 La @ref{tabella-varianti-getline}
 9563 riassume le otto varianti di @code{getline},
 9564 elencando le variabili predefinite che sono impostate da ciascuna di esse,
 9565 e se la variante @`e standard o @`e un'estensione di @command{gawk}.
 9566 Nota: per ogni variante, @command{gawk} imposta la variabile predefinita
 9567 @code{RT}.
 9568 
 9569 @float Tabella,tabella-varianti-getline
 9570 @caption{Varianti di @code{getline} e variabili impostate da ognuna}
 9571 @multitable @columnfractions .33 .38 .27
 9572 @headitem Variante @tab Effetto @tab @command{awk} / @command{gawk}
 9573 @item @code{getline} @tab Imposta @code{$0}, @code{NF}, @code{FNR}, @code{NR}, e @code{RT} @tab @command{awk}
 9574 @item @code{getline} @var{var} @tab Imposta @var{var}, @code{FNR}, @code{NR}, e @code{RT} @tab @command{awk}
 9575 @item @code{getline <} @var{file} @tab Imposta @code{$0}, @code{NF}, e @code{RT} @tab @command{awk}
 9576 @item @code{getline @var{var} < @var{file}} @tab Imposta @var{var} e @code{RT} @tab @command{awk}
 9577 @item @var{comando} @code{| getline} @tab Imposta @code{$0}, @code{NF}, e @code{RT} @tab @command{awk}
 9578 @item @var{comando} @code{| getline} @var{var} @tab Imposta @var{var} e @code{RT} @tab @command{awk}
 9579 @item @var{comando} @code{|& getline} @tab Imposta @code{$0}, @code{NF}, e @code{RT} @tab @command{gawk}
 9580 @item @var{comando} @code{|& getline} @var{var} @tab Imposta @var{var} e @code{RT} @tab @command{gawk}
 9581 @end multitable
 9582 @end float
 9583 
 9584 @node Timeout in lettura
 9585 @section Leggere input entro un tempo limite
 9586 @cindex tempo limite @subentry entro il quale leggere input
 9587 @cindex @dfn{timeout} @seeentry{tempo limite}
 9588 
 9589 @cindex differenze tra @command{awk} e @command{gawk} @subentry tempo limite per lettura
 9590 @ifnotinfo
 9591 Questa
 9592 @end ifnotinfo
 9593 @ifinfo
 9594 Questo
 9595 @end ifinfo
 9596 @value{SECTION} descrive una funzionalit@`a disponibile solo in
 9597 @command{gawk}.
 9598 
 9599 Si pu@`o  specificare un tempo limite in millisecondi per leggere l'input dalla
 9600 tastiera, da una @dfn{pipe} o da una comunicazione bidirezionale, compresi i
 9601 @dfn{socket} TCP/IP.  Questo pu@`o essere fatto per input, per comando o per
 9602 connessione, impostando un elemento speciale nel vettore @code{PROCINFO}
 9603 (@pxref{Variabili auto-assegnate}):
 9604 
 9605 @example
 9606 PROCINFO["nome_input", "READ_TIMEOUT"] = @var{tempo limite in millisecondi}
 9607 @end example
 9608 
 9609 Se @`e impostato, @command{gawk} smette di attendere una risposta e restituisce
 9610 insuccesso se non sono disponibili dati da leggere entro il limite di tempo
 9611 specificato.  Per esempio, un cliente TCP pu@`o decidere di abbandonare se
 9612 non riceve alcuna risposta dal server dopo un certo periodo di tempo:
 9613 
 9614 @example
 9615 @group
 9616 Service = "/inet/tcp/0/localhost/daytime"
 9617 PROCINFO[Service, "READ_TIMEOUT"] = 100
 9618 if ((Service |& getline) > 0)
 9619     print $0
 9620 else if (ERRNO != "")
 9621     print ERRNO
 9622 @end group
 9623 @end example
 9624 
 9625 Qui vediamo come ottenere dati interattivamente dall'utente@footnote{Questo
 9626 presuppone che lo standard input provenga dalla tastiera.} aspettando per
 9627 non pi@`u di cinque secondi:
 9628 
 9629 @example
 9630 PROCINFO["/dev/stdin", "READ_TIMEOUT"] = 5000
 9631 while ((getline < "/dev/stdin") > 0)
 9632     print $0
 9633 @end example
 9634 
 9635 @command{gawk} termina l'operazione di lettura se l'input non
 9636 arriva entro il periodo di tempo limite, restituisce insuccesso
 9637 e imposta @code{ERRNO} a una stringa di valore adeguato.
 9638 Un valore del tempo limite negativo o pari a zero equivale a non specificare
 9639 affatto un tempo limite.
 9640 
 9641 Si pu@`o impostare un tempo limite anche per leggere dalla tastiera nel ciclo
 9642 implicito che legge i record in input e li confronta coi criteri di ricerca,
 9643 come:
 9644 
 9645 @example
 9646 $ @kbd{gawk 'BEGIN @{ PROCINFO["-", "READ_TIMEOUT"] = 5000 @}}
 9647 > @kbd{@{ print "You entered: " $0 @}'}
 9648 @kbd{gawk}
 9649 @print{} You entered: gawk
 9650 @end example
 9651 
 9652 In questo caso, la mancata risposta entro cinque secondi d@`a luogo al seguente
 9653 messaggio di errore:
 9654 
 9655 @example
 9656 @c questo @`e l'output effettivo - Antonio
 9657 @error{} gawk: riga com.:2: (FILENAME=- FNR=1) fatale: errore leggendo
 9658 @error{}                         file in input `-': Connessione scaduta
 9659 @end example
 9660 
 9661 Il tempo limite pu@`o essere impostato o cambiato in qualsiasi momento, e avr@`a
 9662 effetto al tentativo successivo di leggere dal dispositivo di input.  Nel
 9663 seguente esempio, partiamo con un valore di tempo limite di un secondo e
 9664 lo riduciamo progressivamente di un decimo di secondo finch@'e l'attesa
 9665 per l'input diventa illimitata.
 9666 
 9667 @example
 9668 PROCINFO[Service, "READ_TIMEOUT"] = 1000
 9669 while ((Service |& getline) > 0) @{
 9670     print $0
 9671     PROCINFO[Service, "READ_TIMEOUT"] -= 100
 9672 @}
 9673 @end example
 9674 
 9675 @quotation NOTA
 9676 Non si deve dare per scontato che l'operazione di lettura si blocchi
 9677 esattamente dopo che @`e stato stampato il decimo record.  @`E possibile che
 9678 @command{gawk} legga e tenga in memoria i dati di pi@`u di un record
 9679 la prima volta.  Per questo, cambiare il valore del tempo
 9680 limite come nell'esempio appena visto non @`e molto utile.
 9681 @end quotation
 9682 
 9683 @cindex @env{GAWK_READ_TIMEOUT} (variabile d'ambiente)
 9684 @cindex variabili d'ambiente @subentry @env{GAWK_READ_TIMEOUT}
 9685 Se l'elemento di @code{PROCINFO} non @`e presente e la variabile d'ambiente
 9686 @env{GAWK_READ_TIMEOUT} esiste,
 9687 @command{gawk} usa il suo valore per inizializzare il valore di tempo limite.
 9688 L'uso esclusivo della variabile d'ambiente per specificare il tempo limite
 9689 ha lo svantaggio di non essere
 9690 adattabile per ogni comando o per ogni connessione.
 9691 
 9692 @command{gawk} considera errore un superamento di tempo limite anche se
 9693 il tentativo di leggere dal dispositivo sottostante potrebbe riuscire
 9694 in un tentativo successivo.  Questa @`e una limitazione, e inoltre
 9695 significa che non @`e possibile usarlo per ottenere input multipli,
 9696 provenienti da due o pi@`u sorgenti.  @xref{Proseguire dopo errore in input}
 9697 per una modalit@`a che consente di tentare ulteriori operazioni di I/O.
 9698 
 9699 Assegnare un valore di tempo limite previene un blocco a tempo indeterminato
 9700 legato a operazioni di lettura.  Si tenga per@`o presente che ci sono altre
 9701 situazioni in cui @command{gawk} pu@`o restare bloccato in attesa che un
 9702 dispositivo di input sia pronto.  Un cliente di rete a volte pu@`o impiegare
 9703 molto tempo per stabilire una
 9704 connessione prima di poter iniziare a leggere qualsiasi dato,
 9705 oppure il tentativo di aprire un file speciale FIFO in lettura pu@`o bloccarsi
 9706 indefinitamente in attesa che qualche altro processo lo apra in scrittura.
 9707 
 9708 @node Proseguire dopo errore in input
 9709 @section Elaborare ulteriore input dopo certi errori di I/O
 9710 @cindex proseguire dopo errore in input
 9711 @cindex errore @subentry in input @subentry possibilit@`a di proseguire
 9712 
 9713 @cindex differenze tra @command{awk} e @command{gawk} @subentry proseguire dopo errore in input
 9714 @ifnotinfo
 9715 Questa
 9716 @end ifnotinfo
 9717 @ifinfo
 9718 Questo
 9719 @end ifinfo
 9720 @value{SECTION} descrive una funzionalit@`a disponibile solo in
 9721 @command{gawk}.
 9722 
 9723 Qualora @command{gawk} incontri un errore durante la lettura dell'input,
 9724 per default @code{getline} ha come codice di ritorno @minus{}1, e i
 9725 successivi tentativi di leggere dallo stesso file restituiscono una
 9726 indicazione di fine-file.  @`E tuttavia possibile chiedere a
 9727 @command{gawk} di consentire un ulteriore tentativo di lettura in presenza
 9728 di certi errori, impostando uno speciale elemento del vettore
 9729 @code{PROCINFO} (@pxref{Variabili auto-assegnate}):
 9730 
 9731 @example
 9732 PROCINFO["@var{nome_input_file}", "RETRY"] = 1
 9733 @end example
 9734 
 9735 Quando un tale elemento esiste, @command{gawk} controlla il valore della
 9736 variabile di sistema
 9737 (nel linguaggio C)
 9738 @code{errno} quando si verifica un errore di I/O.
 9739 Se @code{errno} indica che un ulteriore tentativo di lettura pu@`o
 9740 terminare con successo, @code{getline} ha come codice di ritorno @minus{}2
 9741 e ulteriori chiamate a @code{getline} possono terminare correttamente.
 9742 Questo vale per i seguenti valori di @code{errno}: @code{EAGAIN},
 9743 @code{EWOULDBLOCK}, @code{EINTR}, e @code{ETIMEDOUT}.
 9744 
 9745 Questa funzionalit@`a @`e utile quando si assegna un valore all'elemento
 9746 @code{PROCINFO["@var{nome_input_file}", "READ_TIMEOUT"]} o in situazioni
 9747 in cui un descrittore di file sia stato configurato per comportarsi in
 9748 modo non bloccante.
 9749 
 9750 @node Directory su riga di comando
 9751 @section Directory sulla riga di comando
 9752 @cindex differenze tra @command{awk} e @command{gawk} @subentry directory sulla riga di comando
 9753 @cindex directory @subentry riga di comando
 9754 @cindex riga di comando @subentry directory su
 9755 
 9756 Per lo standard POSIX, i file che compaiono sulla riga di comando di
 9757 @command{awk} devono essere file di testo; @`e un errore fatale se non lo sono.
 9758 La maggior parte delle versioni di @command{awk} genera un errore fatale
 9759 quando trova una directory sulla riga di comando.
 9760 
 9761 Per default, @command{gawk} emette un avvertimento se c'@`e una directory sulla
 9762 riga di comando, e in ogni caso la ignora.  Questo rende pi@`u facile usare
 9763 metacaratteri di shell col proprio programma @command{awk}:
 9764 
 9765 @example
 9766 $ @kbd{gawk -f whizprog.awk *} @ii{Le directory potrebbero far fallire il programma}
 9767 @end example
 9768 
 9769 Se viene data una delle opzioni @option{--posix}
 9770 o @option{--traditional}, @command{gawk} considera invece
 9771 una directory sulla riga di comando come un errore fatale.
 9772 
 9773 @xref{Esempio di estensione Readdir} per un modo di trattare le directory
 9774 come dati usabili da un programma @command{awk}.
 9775 
 9776 @sp 2
 9777 @node Sommario di Input
 9778 @section Sommario di Input
 9779 
 9780 @itemize @value{BULLET}
 9781 @item
 9782 L'input @`e diviso in record in base al valore di @code{RS}.
 9783 Le possibilit@`a sono le seguenti:
 9784 
 9785 @multitable @columnfractions .28 .45 .40
 9786 @headitem Valore di @code{RS} @tab Record separati da @dots{} @tab @command{awk} / @command{gawk}
 9787 @item Un carattere singolo @tab Quel carattere @tab @command{awk}
 9788 @item La stringa nulla (@code{""}) @tab Serie di due o pi@`u ritorni a capo @tab @command{awk}
 9789 @item Un'espressione regolare @tab Testo corrispondente alla @dfn{regexp} @tab @command{gawk}
 9790 @end multitable
 9791 
 9792 @item
 9793 @code{FNR} indica quanti record sono stati letti dal file in input corrente;
 9794 @code{NR} indica quanti record sono stati letti in totale.
 9795 
 9796 @item
 9797 @command{gawk} imposta @code{RT} al testo individuato da @code{RS}.
 9798 
 9799 @item
 9800 Dopo la divisione dell'input in record, @command{awk} divide
 9801 i record in singoli campi, chiamati @code{$1}, @code{$2} e cos@`{@dotless{i}}
 9802 via.  @code{$0} @`e l'intero record, e @code{NF} indica quanti campi
 9803 contiene.  Il metodo di default per dividere i campi utilizza i
 9804 caratteri di spazio vuoto.
 9805 
 9806 @item Si pu@`o far riferimento ai campi usando una variabile, come in @code{$NF}.
 9807 Ai campi possono anche essere assegnati dei valori, e questo implica che il
 9808 valore di @code{$0} sia ricalcolato se ad esso si fa riferimento in seguito.
 9809 Fare un assegnamento a un campo con un numero maggiore di @code{NF} crea il
 9810 campo e ricostruisce il record, usando @code{OFS} per separare i campi.
 9811 Incrementare @code{NF} fa la stessa cosa.  Decrementare @code{NF} scarta dei
 9812 campi e ricostruisce il record.
 9813 
 9814 @item
 9815 Separare i campi @`e pi@`u complicato che separare i record.
 9816 
 9817 @multitable @columnfractions .40 .40 .20
 9818 @headitem Valore del separatore di campo @tab Campi separati @dots{} @tab @command{awk} / @command{gawk}
 9819 @item @code{FS == " "} @tab Da serie di spazi vuoti @tab @command{awk}
 9820 @item @code{FS == @var{un solo carattere}} @tab Da quel carattere @tab @command{awk}
 9821 @item @code{FS == @var{espr. reg.}} @tab Dal testo che corrisponde alla @dfn{regexp} @tab @command{awk}
 9822 @item @code{FS == ""}  @tab Cos@`{@dotless{i}} ogni singolo carattere @`e un campo separato @tab @command{gawk}
 9823 @item @code{FIELDWIDTHS == @var{lista di colonne}} @tab Basata sulla posizione del carattere @tab @command{gawk}
 9824 @item @code{FPAT == @var{regexp}} @tab Dal testo attorno al testo corrispondente alla @dfn{regexp} @tab @command{gawk}
 9825 @end multitable
 9826 
 9827 @item
 9828 Usando @samp{FS = "\n"} l'intero record sar@`a un unico campo
 9829 (nell'ipotesi che i record siano separati da caratteri di ritorno a capo).
 9830 
 9831 @item
 9832 @code{FS} pu@`o essere impostato dalla riga di comando con l'opzione
 9833 @option{-F}.
 9834 Si pu@`o fare la stessa cosa usando un assegnamento di variabile da riga di
 9835 comando.
 9836 
 9837 @item
 9838 @code{PROCINFO["FS"]} permette di sapere come i campi sono separati.
 9839 
 9840 @item
 9841 @code{getline} nelle sue diverse forme serve per leggere record aggiuntivi
 9842 provenienti dal flusso di input di default, da un file, o da una @dfn{pipe}
 9843 o da un coprocesso.
 9844 
 9845 @item
 9846 @code{PROCINFO[@var{file}, "READ_TIMEOUT"]} si pu@`o usare per impostare un
 9847 tempo limite alle operazioni di lettura da @var{file}.
 9848 
 9849 @cindex POSIX @subentry modalit@`a
 9850 @cindex modalit@`a POSIX 
 9851 @item
 9852 Le directory sulla riga di comando generano un errore fatale per
 9853 @command{awk} standard;
 9854 @command{gawk} le ignora se non @`e in modalit@`a POSIX.
 9855 
 9856 @end itemize
 9857 
 9858 @c EXCLUDE START
 9859 @node Esercizi su Input
 9860 @section Esercizi
 9861 
 9862 @enumerate
 9863 @item
 9864 Usando la variabile @code{FIELDWIDTHS} (@pxref{Dimensione costante}),
 9865 scrivere un programma per leggere i dati delle elezioni, dove ogni record
 9866 rappresenta i voti di un votante.  Trovare un modo per definire quali colonne
 9867 sono associate a ogni quesito elettorale, e stampare i voti totali,
 9868 comprese le astensioni, per ciascun quesito.
 9869 
 9870 @end enumerate
 9871 @c EXCLUDE END
 9872 
 9873 @node Stampare
 9874 @chapter Stampare in output
 9875 
 9876 @cindex stampare
 9877 @cindex output @subentry stampare @seeentry{stampare}
 9878 Una delle azioni che un programma fa pi@`u comunemente, @`e quella di produrre
 9879 @dfn{stampe}, ossia scrivere in output l'input letto, tutto o in parte.
 9880 Si pu@`o usare l'istruzione @code{print} per una stampa semplice, e l'istruzione
 9881 @code{printf} per una formattazione dell'output pi@`u sofisticata.
 9882 L'istruzione @code{print} non ha un limite al numero di elementi quando
 9883 calcola @emph{quali} valori stampare.  Peraltro, con due eccezioni,
 9884 non @`e possibile specificare @emph{come} stamparli: quante
 9885 colonne, se usare una notazione esponenziale o no, etc.
 9886 (Per le eccezioni, @pxref{Separatori di output} e
 9887 la @ref{OFMT}.)
 9888 Per stampare fornendo delle specifiche, @`e necessario usare
 9889 l'istruzione @code{printf}
 9890 (@pxref{Printf}).
 9891 
 9892 @cindex istruzione @subentry @code{print}
 9893 @cindex istruzione @subentry @code{printf}
 9894 Oltre alla stampa semplice e formattata, questo @value{CHAPTER}
 9895 esamina anche le ridirezioni di I/O verso file e @dfn{pipe}, introduce
 9896 i @value{FNS} speciali che @command{gawk} elabora internamente,
 9897 e parla della funzione predefinita @code{close()}.
 9898 
 9899 @menu
 9900 * Print::                       L'istruzione @code{print}.
 9901 * Esempi su print::             Semplici esempi di
 9902                                 istruzioni @code{print}.
 9903 * Separatori di output::        I separatori di output e come
 9904                                 modificarli.
 9905 * OFMT::                        Controllare l'output di numeri con
 9906                                 @code{print}.
 9907 * Printf::                      l'istruzione @code{printf}.
 9908 * Ridirezione::                 Come ridirigere l'output a diversi
 9909                                 file e @dfn{pipe}.
 9910 * FD speciali::                 I/O con FD [Descrittori File]
 9911                                 speciali.
 9912 * File speciali::               Interpretazione nomi file in
 9913                                 @command{gawk}. @command{gawk}
 9914                                 Permette di accedere a descrittori
 9915 				file gi@`a aperti a inizio esecuzione
 9916 * Chiusura file e @dfn{pipe}::  Chiudere file in input e di output e
 9917                                 @dfn{pipe}.
 9918 * Continuazione dopo errori::   Abilitare continuazione dopo errori
 9919                                 in output.
 9920 * Sommario di Output::          Sommario di Output.
 9921 * Esercizi su Output::          Esercizi.
 9922 @end menu
 9923 
 9924 @node Print
 9925 @section L'istruzione @code{print}
 9926 
 9927 L'istruzione @code{print} si usa per produrre dell'output formattato in
 9928 maniera semplice, standardizzata.  Si
 9929 specificano solo le stringhe o i numeri
 9930 da stampare, in una lista separata da virgole.  Questi elementi sono stampati,
 9931 separati tra loro da spazi singoli, e alla fine viene stampato un
 9932 ritorno a capo.  L'istruzione @`e simile a questa:
 9933 
 9934 @example
 9935 print @var{elemento1}, @var{elemento2}, @dots{}
 9936 @end example
 9937 
 9938 @noindent
 9939 L'intera lista di elementi pu@`o opzionalmente essere racchiusa fra
 9940 parentesi.  Le parentesi sono obbligatorie se qualche espressione presente
 9941 in uno degli elementi usa l'operatore relazionale @samp{>}, che potrebbe
 9942 essere confuso con una ridirezione dell'output (@pxref{Ridirezione}).
 9943 
 9944 Gli elementi da stampare possono essere stringhe costanti o numeri, campi
 9945 del record corrente (come @code{$1}), variabili, o quasiasi espressione
 9946 @command{awk}.  I valori numerici sono convertiti in stringhe prima di essere
 9947 stampati.
 9948 
 9949 @cindex record @subentry stampare
 9950 @cindex righe @subentry vuote @subentry stampare
 9951 @cindex testo @subentry stampare
 9952 Una semplice istruzione @samp{print} senza specificare elementi equivale a
 9953 @samp{print $0}: stampa l'intero record corrente.  Per stampare una riga
 9954 vuota, si usa @samp{print ""}.
 9955 Per stampare un testo che non cambia, si usi come elemento una costante
 9956 stringa, per esempio @w{@code{"Non v'allarmate"}}.  Dimenticandosi di mettere
 9957 i doppi apici, il testo @`e preso per un'espressione @command{awk},
 9958 e probabilmente verr@`a emesso un messaggio di errore.  Occorre tener presente
 9959 che tra ogni coppia di elementi viene stampato uno spazio.
 9960 
 9961 Si noti che l'istruzione @code{print} @`e un'istruzione, e non
 9962 un'espressione: non @`e possibile usarla nella parte modello [di ricerca] di
 9963 un'istruzione @dfn{criterio di ricerca--azione}, per esempio.
 9964 
 9965 @node Esempi su print
 9966 @section Esempi di istruzioni @code{print}
 9967 
 9968 Ogni istruzione @code{print} produce almeno una riga in output.  Comunque,
 9969 non @`e limitata a una sola riga.  Se il valore di un elemento @`e una stringa
 9970 che contiene un ritorno a capo, il ritorno a capo @`e stampato insieme al
 9971 resto della stringa.  Una
 9972 singola istruzione @code{print} pu@`o in questo modo generare un numero
 9973 qualsiasi di righe.
 9974 
 9975 @cindex ritorno a capo @subentry stampare un
 9976 Quel che segue @`e un esempio di stampa di una stringa che contiene al suo
 9977 interno dei
 9978 @ifinfo
 9979 ritorni a capo
 9980 (la @samp{\n} @`e una sequenza di protezione, che si usa per rappresentare il
 9981 carattere di ritorno a capo; @pxref{Sequenze di protezione}):
 9982 @end ifinfo
 9983 @ifhtml
 9984 ritorni a capo
 9985 (la @samp{\n} @`e una sequenza di protezione, che si usa per rappresentare il
 9986 carattere di ritorno a capo; @pxref{Sequenze di protezione}):
 9987 @end ifhtml
 9988 @ifnotinfo
 9989 @ifnothtml
 9990 ritorni a capo:
 9991 @end ifnothtml
 9992 @end ifnotinfo
 9993 
 9994 @example
 9995 @group
 9996 $ @kbd{awk 'BEGIN @{ print "riga uno\nriga due\nriga tre" @}'}
 9997 @print{} riga uno
 9998 @print{} riga due
 9999 @print{} riga tre
10000 @end group
10001 @end example
10002 
10003 @cindex campi @subentry stampare
10004 Il prossimo esempio, eseguito sul file @file{inventory-shipped},
10005 stampa i primi due campi di ogni record in input, separandoli con uno
10006 spazio:
10007 
10008 @example
10009 $ @kbd{awk '@{ print $1, $2 @}' inventory-shipped}
10010 @print{} Jan 13
10011 @print{} Feb 15
10012 @print{} Mar 15
10013 @dots{}
10014 @end example
10015 
10016 @cindex istruzione @subentry @code{print} @subentry virgole, omettere
10017 @cindex debug @subentry istruzione @code{print} @subentry omissione virgole
10018 Un errore frequente usando l'istruzione @code{print} @`e quello di tralasciare
10019 la virgola tra due elementi.  Questo ha spesso come risultato la stampa di
10020 elementi attaccati tra loro, senza lo spazio di separazione.  Il motivo per
10021 cui ci@`o accade @`e che la scrittura di due
10022 espressioni di stringa in @command{awk} ne indica la concatenazione.  Qui si
10023 vede l'effetto dello stesso programma,
10024 senza le virgole:
10025 
10026 @example
10027 $ @kbd{awk '@{ print $1 $2 @}' inventory-shipped}
10028 @print{} Jan13
10029 @print{} Feb15
10030 @print{} Mar15
10031 @dots{}
10032 @end example
10033 
10034 @cindex @code{BEGIN} (regola) @subentry intestazioni, aggiungere
10035 Per chi non conosce il file @file{inventory-shipped} nessuno
10036 dei due output di esempio risulta molto comprensibile.  Una riga iniziale di
10037 intestazione li renderebbe pi@`u chiari.
10038 Aggiungiamo qualche intestazione alla nostra tabella dei mesi
10039 (@code{$1}) e dei contenitori verdi spediti (@code{$2}).  Lo facciamo usando
10040 una regola @code{BEGIN} (@pxref{BEGIN/END}) in modo che le intestazioni siano
10041 stampate una volta sola:
10042 
10043 @example
10044 awk 'BEGIN @{  print "Mese  Contenitori"
10045               print "------ -----  --- --" @}
10046            @{  print $1, $2 @}' inventory-shipped
10047 @end example
10048 
10049 @noindent
10050 Una volta eseguito, il programma stampa questo:
10051 
10052 @example
10053 Mese  Contenitori
10054 ----- -----------
10055 Jan 13
10056 Feb 15
10057 Mar 15
10058 @dots{}
10059 @end example
10060 
10061 @noindent
10062 Il solo problema, in effetti, @`e che le intestazioni e i dati della tabella
10063 non sono allineati!  Possiamo provvedere stampando alcuni spazi tra i due
10064 campi:
10065 
10066 @example
10067 @group
10068 awk 'BEGIN @{  print "Mese  Contenitori"
10069               print "------ -----  --- --" @}
10070            @{ print $1, "     ", $2 @}' inventory-shipped
10071 @end group
10072 @end example
10073 
10074 @cindex istruzione @subentry @code{printf} @subentry colonne, allineamento
10075 @cindex colonne @subentry allineamento
10076 Allineare le colonne in questo modo pu@`o diventare piuttosto
10077 complicato, quando ci sono parecchie colonne da tenere allineate.  Contare gli
10078 spazi per due o tre colonne @`e semplice, ma oltre questo limite comincia a
10079 volerci molto tempo.  Ecco perch@'e @`e disponibile l'istruzione @code{printf}
10080 (@pxref{Printf});
10081 una delle possibilit@`a che offre @`e quella di allineare colonne di dati.
10082 
10083 @cindex continuazione di riga @subentry in istruzione @code{print}
10084 @cindex istruzione @subentry @code{print} @subentry continuazione di riga e
10085 @cindex @code{print} (istruzione) @subentry continuazione di riga e
10086 @quotation NOTA
10087 Si pu@`o continuare su pi@`u righe sia l'istruzione @code{print} che l'istruzione
10088 @code{printf} semplicemente mettendo un ritorno a capo dopo una virgola
10089 qualsiasi
10090 (@pxref{Istruzioni/Righe}).
10091 @end quotation
10092 
10093 @node Separatori di output
10094 @section I separatori di output e come modificarli
10095 
10096 @cindex variabile @subentry @code{OFS}
10097 Come detto sopra, un'istruzione @code{print} contiene una lista di elementi
10098 separati da virgole.  Nell'output, gli elementi sono solitamente separati
10099 da spazi singoli.  Non @`e detto tuttavia che debba sempre essere cos@`{@dotless{i}}; uno
10100 spazio singolo @`e semplicemente il valore di default.  Qualsiasi stringa di
10101 caratteri pu@`o essere usata come
10102 @dfn{separatore di campo in output} impostando la variabile
10103 predefinita @code{OFS}.  Il valore iniziale di questa variabile @`e
10104 la stringa @w{@code{" "}} (cio@`e, uno spazio singolo).
10105 
10106 L'output di un'istruzione @code{print} completa @`e detto un @dfn{record di
10107 output}.  Ogni istruzione @code{print} stampa un record di output, e alla fine
10108 ci aggiunge una stringa detta @dfn{separatore record in output} (o
10109 @code{ORS}).  Il valore iniziale di @code{ORS} @`e la stringa @code{"\n"}
10110 (cio@`e, un carattere di ritorno a capo).  Quindi, ogni istruzione
10111 @code{print} normalmente genera [almeno] una riga a s@'e stante.
10112 
10113 @cindex output @subentry record
10114 @cindex separatore di record @subentry in output @seeentry{@code{ORS} (variabile)}
10115 @cindex @code{ORS} (variabile)
10116 @cindex @code{BEGIN} (regola) @subentry variabili @code{OFS}/@code{ORS}, assegnare valori a
10117 Per cambiare il tipo di separazione in output di campi e record, si impostano
10118 valori differenti alle variabili @code{OFS} e @code{ORS}.  Il posto pi@`u
10119 indicato per farlo @`e nella regola @code{BEGIN}
10120 (@pxref{BEGIN/END}), in modo che l'assegnazione abbia effetto prima
10121 dell'elaborazione di ogni record in input.  Questi valori si possono
10122 anche impostare dalla riga di comando, prima della lista dei file in input,
10123 oppure usando l'opzione della riga di comando @option{-v}
10124 (@pxref{Opzioni}).
10125 L'esempio seguente stampa il primo e il secondo campo di ogni record in input,
10126 separati da un punto e virgola, con una riga vuota aggiunta dopo ogni
10127 ritorno a capo:
10128 
10129 
10130 @example
10131 $ @kbd{awk 'BEGIN @{ OFS = ";"; ORS = "\n\n" @}}
10132 >            @kbd{@{ print $1, $2 @}' mail-list}
10133 @print{} Amelia;555-5553
10134 @print{}
10135 @print{} Anthony;555-3412
10136 @print{}
10137 @print{} Becky;555-7685
10138 @print{}
10139 @print{} Bill;555-1675
10140 @print{}
10141 @print{} Broderick;555-0542
10142 @print{}
10143 @print{} Camilla;555-2912
10144 @print{}
10145 @print{} Fabius;555-1234
10146 @print{}
10147 @print{} Julie;555-6699
10148 @print{}
10149 @print{} Martin;555-6480
10150 @print{}
10151 @print{} Samuel;555-3430
10152 @print{}
10153 @print{} Jean-Paul;555-2127
10154 @print{}
10155 @end example
10156 
10157 Se il valore di @code{ORS} non contiene un ritorno a capo, l'output del
10158 programma viene scritto tutto su un'unica riga.
10159 
10160 @node OFMT
10161 @section Controllare l'output di numeri con @code{print}
10162 @cindex numerico @subentry formato di output
10163 @cindex formato @subentry numerico di output
10164 Quando si stampano valori numerici con l'istruzione @code{print},
10165 @command{awk} converte internamente ogni numero in una stringa di caratteri
10166 e stampa quella stringa.  @command{awk} usa la funzione @code{sprintf()}
10167 per effettuare questa conversione
10168 (@pxref{Funzioni per stringhe}).
10169 Per ora, basta dire che la funzione @code{sprintf()}
10170 accetta una @dfn{specifica di formato} che indica come formattare
10171 i numeri (o le stringhe), e che ci sono svariati modi per formattare i
10172 numeri.  Le differenti specifiche di formato sono trattate pi@`u
10173 esaurientemente
10174 @iftex
10175 nella
10176 @end iftex
10177 @ifnottex
10178 in
10179 @end ifnottex
10180 @ref{Lettere di controllo}.
10181 
10182 @cindexawkfunc{sprintf}
10183 @cindex @code{OFMT} (variabile)
10184 @cindex output @subentry specificatore di formato @subentry @code{OFMT}
10185 La variabile predefinita @code{OFMT} contiene la specifica di formato
10186 che @code{print} usa con @code{sprintf()} per convertire un numero in
10187 una stringa per poterla stampare.
10188 Il valore di default di @code{OFMT} @`e @code{"%.6g"}.
10189 Il modo in cui @code{print} stampa i numeri si pu@`o cambiare
10190 fornendo una specifica di formato differente
10191 per il valore di @code{OFMT}, come mostrato nell'esempio seguente:
10192 
10193 @example
10194 $ @kbd{awk 'BEGIN @{}
10195 >   @kbd{OFMT = "%.0f"  # Stampa numeri come interi (arrotonda)}
10196 >   @kbd{print 17.23, 17.54 @}'}
10197 @print{} 17 18
10198 @end example
10199 
10200 @noindent
10201 @cindex angolo buio @subentry variabile @subentry @code{OFMT}
10202 @cindex POSIX @command{awk} @subentry @code{OFMT} (variabile)
10203 @cindex variabile @subentry @code{OFMT} @subentry POSIX @command{awk} in
10204 Per lo standard POSIX, il comportamento di @command{awk} @`e indefinito
10205 se @code{OFMT} contiene qualcosa di diverso da una specifica di conversione
10206 di un numero in virgola mobile.
10207 @value{DARKCORNER}
10208 
10209 @node Printf
10210 @section Usare l'istruzione @code{printf} per stampe sofisticate
10211 
10212 @cindex istruzione @subentry @code{printf}
10213 @cindex @code{printf} (istruzione)
10214 @cindex output @subentry formattare
10215 @cindex formattare @subentry output
10216 Per un controllo pi@`u ampio sul formato di output di quello fornito da
10217 @code{print}, si pu@`o usare @code{printf}.
10218 Con @code{printf} si pu@`o
10219 specificare lo spazio da utilizzare per ogni elemento, e anche le varie
10220 scelte di formattazione disponibile per i numeri (come la base da usare in
10221 output, se stampare con notazione esponenziale, se inserire un segno, e quante
10222 cifre stampare dopo il separatore decimale).
10223 
10224 @menu
10225 * Printf Fondamenti::         Sintassi dell'istruzione
10226                               @code{printf}.
10227 * Lettere di controllo::      Lettere di controllo del formato.
10228 * Modificatori di formato::             Modificatori specifiche di formato.
10229 * Esempi su printf::          Numerosi esempi.
10230 @end menu
10231 
10232 @node Printf Fondamenti
10233 @subsection Sintassi dell'istruzione @code{printf}
10234 
10235 @cindex istruzione @subentry @code{printf} @subentry sintassi
10236 @cindex @code{printf} (istruzione) @subentry sintassi
10237 Una semplice istruzione @code{printf} @`e qualcosa di simile a questo:
10238 
10239 @example
10240 printf @var{formato}, @var{elemento1}, @var{elemento2}, @dots{}
10241 @end example
10242 
10243 @noindent
10244 Come nel caso di @code{print}, l'intera lista degli argomenti pu@`o
10245 opzionalmente essere racchiusa fra
10246 parentesi.  Anche qui, le parentesi sono obbligatorie se l'espressione di
10247 qualche elemento usa l'operatore
10248 relazionale @samp{>}, che potrebbe
10249 essere confuso con una ridirezione dell'output (@pxref{Ridirezione}).
10250 
10251 @cindex specificatori di formato
10252 La differenza tra @code{printf} e @code{print} @`e l'argomento @var{formato}.
10253 Questo @`e un'espressione il cui valore @`e visto come una stringa;
10254 specifica come scrivere in output ognuno degli altri argomenti.  @`E chiamata
10255 @dfn{stringa di formato}.
10256 
10257 La stringa di formato @`e molto simile a quella usata dalla funzione di
10258 libreria ISO C @code{printf()}.  Buona parte del @var{formato} @`e testo da
10259 stampare cos@`{@dotless{i}} come @`e scritto.
10260 All'interno di questo testo ci sono degli @dfn{specificatori di formato},
10261 uno per ogni elemento da stampare.
10262 Ogni specificatore di formato richiede di stampare l'elemento successivo
10263 nella lista degli argomenti
10264 in quella posizione del formato.
10265 
10266 L'istruzione @code{printf} non aggiunge in automatico un ritorno a capo
10267 al suo output.  Scrive solo quanto specificato dalla stringa di formato.
10268 Quindi, se serve un ritorno a capo, questo va incluso nella stringa di formato.
10269 Le variabili di separazione dell'output @code{OFS} e @code{ORS} non hanno
10270 effetto sulle istruzioni @code{printf}.
10271 Per esempio:
10272 
10273 @example
10274 @group
10275 $ @kbd{awk 'BEGIN @{}
10276 >    @kbd{ORS = "\nAHI!\n"; OFS = "+"}
10277 >    @kbd{msg = "Non v\47allarmate!"}
10278 >    @kbd{printf "%s\n", msg}
10279 > @kbd{@}'}
10280 @print{} Non v'allarmate!
10281 @end group
10282 @end example
10283 
10284 @noindent
10285 Qui, n@'e il @samp{+} n@'e l'esclamazione @samp{AHI!} compaiono nel messaggio
10286 in output.
10287 
10288 @node Lettere di controllo
10289 @subsection Lettere di controllo del formato
10290 @cindex istruzione @subentry @code{printf} @subentry lettere di controllo del formato
10291 @cindex @code{printf} (istruzione) @subentry lettere di controllo del formato
10292 @cindex specificatori di formato @subentry istruzione @code{printf}
10293 
10294 Uno specificatore di formato inizia col carattere @samp{%} e termina con
10295 una @dfn{lettera di controllo del formato}; e dice all'istruzione
10296 @code{printf} come stampare un elemento.  La lettera di controllo del
10297 formato specifica che @emph{tipo}
10298 di valore stampare.  Il resto dello specificatore di formato @`e costituito da
10299 @dfn{modificatori} opzionali che controllano @emph{come} stampare il valore,
10300 per esempio stabilendo la larghezza del campo.  Ecco una lista delle
10301 lettere di controllo del formato:
10302 
10303 @c @asis for docbook to come out right
10304 @table @asis
10305 @item @code{%a}, @code{%A}
10306 Un numero in virgola mobile scritto nella forma
10307 [@code{-}]@code{0x@var{h}.@var{hhhh}p+-@var{dd}}
10308 (formato esadecimale virgola mobile nel compilatore C99).
10309 Per @code{%A},
10310 si usano lettere maiuscole invece che lettere minuscole.
10311 
10312 @quotation NOTA
10313 Lo standard POSIX in vigore richiede il supporto di @code{%a}
10314 e di @code{%A} in @command{awk}.  Per quanto ci consta, oltre a
10315 @command{gawk}, la sola altra versione di @command{awk} che fornisce
10316 questo supporto @`e BWK @command{awk}.
10317 Se si usano questi formati, il programma in questione @`e quindi
10318 estremamente non-portabile!
10319 
10320 Inoltre, questi formati non sono disponibili su alcun sistema in cui
10321 la funzione di libreria C @code{printf()} utilizzata da @command{gawk}
10322 non li supporta.
10323 Al momento in cui questo libro @`e stato scritto, fra i sistemi su cui
10324 @`e stato portato @command{gawk}, il solo sistema noto che
10325 non li supporta @`e OpenVMS.
10326 @end quotation
10327 
10328 @item @code{%c}
10329 Stampa un numero come un carattere; quindi, @samp{printf "%c",
10330 65} stampa la lettera @samp{A}. L'output per un valore costituito da una
10331 stringa @`e il primo carattere della stringa stessa.
10332 
10333 @cindex angolo buio @subentry caratteri di controllo del formato
10334 @cindex @command{gawk} @subentry caratteri di controllo del formato
10335 @quotation NOTA
10336 Lo standard POSIX richiede che il primo carattere di una stringa sia stampato.
10337 In localizzazioni con caratteri multibyte, @command{gawk} tenta di
10338 convertire i primi byte della stringa in un carattere multibyte valido
10339 e poi di stampare la codifica multibyte di quel carattere.
10340 Analogamente, nella stampa di un valore numerico, @command{gawk} ammette che
10341 il valore appartenga all'intervallo numerico di valori che possono essere
10342 contenuti in un carattere multibyte.
10343 Se la conversione alla codifica multibyte non riesce, @command{gawk}
10344 usa gli ultimi otto bit della cifra (quelli meno significativi) come
10345 carattere da stampare.
10346 
10347 Altre versioni di @command{awk} generalmente si limitano a stampare
10348 il primo byte di una stringa o i valori numerici che possono essere
10349 rappresentati in un singolo byte (0--255).
10350 @value{DARKCORNER}
10351 @end quotation
10352 
10353 
10354 @item @code{%d}, @code{%i}
10355 Stampa un numero intero in base decimale.
10356 Le due lettere di controllo sono equivalenti.
10357 (La specificazione @samp{%i} @`e ammessa per compatibilit@`a con ISO C.)
10358 
10359 @item @code{%e}, @code{%E}
10360 Stampa un numero nella notazione scientifica (con uso di esponente).
10361 Per esempio:
10362 
10363 @example
10364 printf "%4.3e\n", 1950
10365 @end example
10366 
10367 @noindent
10368 stampa @samp{1.950e+03}, con un totale di quattro cifre significative, tre
10369 delle quali
10370 seguono il punto che separa la parte intera da quella decimale
10371 [in Italia si usa la virgola al posto del punto]
10372 (L'espressione @samp{4.3} rappresenta due modificatori,
10373 introdotti nella prossima @value{SUBSECTION}).
10374 @samp{%E} usa @samp{E} invece di @samp{e} nell'output.
10375 
10376 @item @code{%f}
10377 Stampa un numero in notazione in virgola mobile.
10378 Per esempio:
10379 
10380 @example
10381 printf "%4.3f", 1950
10382 @end example
10383 
10384 @noindent
10385 stampa @samp{1950.000}, con un minimo di quattro cifre significative, tre
10386 delle quali vengono dopo il punto decimale.
10387 (L'espressione @samp{4.3} rappresenta due modificatori,
10388 introdotti nella prossima @value{SUBSECTION}).
10389 
10390 In sistemi che implementano il formato in virgola mobile, come specificato
10391 dallo standard IEEE 754, il valore infinito negativo @`e rappresentato come
10392 @samp{-inf} o @samp{-infinity},
10393 e l'infinito positivo come
10394 @samp{inf} o @samp{infinity}.
10395 Il valore speciale ``not a number'' [non @`e un numero] viene scritto come
10396 @samp{-nan} o @samp{nan}
10397 (@pxref{Definizioni matematiche}).
10398 
10399 @item @code{%F}
10400 Come @samp{%f}, ma i valori di infinito e di ``not a number'' sono scritti
10401 in lettere maiuscole.
10402 
10403 Il formato @samp{%F} @`e un'estensione POSIX allo standard ISO C; non tutti
10404 i sistemi lo prevedono.  In tali casi,
10405 @command{gawk} usa il formato @samp{%f}.
10406 
10407 @item @code{%g}, @code{%G}
10408 Stampa un numero usando o la notazione scientifica o quella in virgola
10409 mobile, scegliendo la forma pi@`u concisa; se il risultato @`e stampato usando la
10410 notazione scientifica, @samp{%G} usa @samp{E} invece di @samp{e}.
10411 
10412 @item @code{%o}
10413 Stampa un numero intero in ottale, senza segno
10414 (@pxref{Numeri non-decimali}).
10415 
10416 @item @code{%s}
10417 Stampa una stringa.
10418 
10419 @item @code{%u}
10420 Stampa un numero intero decimale, senza segno.
10421 (Questo formato @`e poco usato, perch@'e tutti i numeri in @command{awk}
10422 sono in virgola mobile; @`e disponibile principalmente per compatibilit@`a col
10423 linguaggio C.)
10424 
10425 @item @code{%x}, @code{%X}
10426 Stampa un intero esadecimale senza segno;
10427 @samp{%X} usa le lettere da @samp{A} a @samp{F}
10428 invece che da @samp{a} a @samp{f}
10429 (@pxref{Numeri non-decimali}).
10430 
10431 @item @code{%%}
10432 Stampa un solo carattere @samp{%}.
10433 Questa notazione non serve per stampare alcun
10434 argomento e ignora eventuali modificatori.
10435 @end table
10436 
10437 @cindex angolo buio @subentry caratteri di controllo del formato
10438 @cindex @command{gawk} @subentry caratteri di controllo del formato
10439 @quotation NOTA
10440 Quando si usano lettere di controllo del formato per numeri interi
10441 per stampare valori esterni all'intervallo massimo disponibile nel
10442 linguaggio C per i numeri interi,
10443 @command{gawk} usa lo
10444 specificatore di formato @samp{%g}. Se si specifica l'opzione @option{--lint}
10445 sulla riga di comando (@pxref{Opzioni}), @command{gawk}
10446 emette un messaggio di avvertimento.  Altre versioni di @command{awk} possono
10447 stampare valori non validi, o comportarsi in modo completamente differente.
10448 @value{DARKCORNER}
10449 @end quotation
10450 
10451 @quotation NOTA
10452 Lo standard IEEE 754 per l'aritmetica in virgola mobile consente di
10453 avere valori speciali per rappresentare ``infinito'' (sia positivo che
10454 negativo) e valori che sono ``non numerici'' (NaN - [Not a Number]).
10455 
10456 L'input e l'output di tali valori avviene sotto forma di stringhe di
10457 testo.  Ci@`o pone dei problemi nel linguaggio @command{awk}, che
10458 esisteva gi@`a prima della definizione dello standard IEEE.  Dettagli
10459 ulteriori si possono trovare in @ref{Problemi virgola mobile POSIX};
10460 si prega di fare riferimento a quel testo.
10461 @end quotation
10462 
10463 @node Modificatori di formato
10464 @subsection Modificatori per specifiche di formato @code{printf}
10465 
10466 @cindex istruzione @subentry @code{printf} @subentry modificatori
10467 @cindex @code{printf} (istruzione) @subentry modificatori
10468 @cindex modificatori @subentry in specificatori di formato
10469 Una specifica di formato pu@`o anche includere dei @dfn{modificatori} che
10470 possono controllare che parte stampare del valore dell'elemento, e anche
10471 quanto spazio utilizzare per stamparlo.
10472 I modificatori sono posizionati tra il @samp{%} e la lettera che controlla
10473 il formato.
10474 Negli esempi seguenti verr@`a usato il simbolo del punto elenco ``@bullet{}'' per
10475 rappresentare
10476 spazi nell'output.  Questi sono i modificatori previsti, nell'ordine in
10477 cui possono apparire:
10478 
10479 @table @asis
10480 @cindex differenze tra @command{awk} e @command{gawk} @subentry tra istruzioni @code{print} e @code{printf}
10481 @cindex istruzione @subentry @code{printf} @subentry specificatori di posizione
10482 @cindex @code{printf} (istruzione) @subentry specificatori di posizione
10483 @c the code{} does NOT start a secondary
10484 @cindex specificatori di posizione @subentry istruzione @code{printf}
10485 @item @code{@var{N}$}
10486 Una costante intera seguita da un @samp{$} @`e uno @dfn{specificatore di posizione}.
10487 Normalmente, le specifiche di formato sono applicate agli argomenti
10488 nell'ordine in cui appaiono nella stringa di formato.  Con uno specificatore
10489 di posizione, la specifica di formato @`e applicata a un argomento
10490 indicato per numero, invece che a quello che
10491 sarebbe il prossimo argomento nella lista.  Gli specificatori di posizione
10492 iniziano a contare partendo da uno.  Quindi:
10493 
10494 @example
10495 printf "%s %s\n", "Non", "v'allarmate"
10496 printf "%2$s %1$s\n", "v'allarmate", "Non"
10497 @end example
10498 
10499 @noindent
10500 stampa per due volte il famoso consiglio amichevole.
10501 
10502 A prima vista, questa funzionalit@`a non sembra di grande utilit@`a.
10503 Si tratta in effetti di un'estensione @command{gawk}, pensata per essere
10504 usata nella traduzione di messaggi emessi in fase di esecuzione.
10505 @xref{Ordinamento di printf},
10506 che descrive come e perch@'e usare specificatori di posizione.
10507 Per ora li possiamo ignorare.
10508 
10509 @item - @code{-} (Segno meno)
10510 Il segno meno, usato prima del modificatore di larghezza (si veda pi@`u avanti
10511 in questa lista),
10512 richiede di allineare a sinistra
10513 l'argomento mantenendo la larghezza specificata.  Normalmente, l'argomento
10514 @`e stampato allineato a destra, con la larghezza specificata. Quindi:
10515 
10516 @example
10517 printf "%-6s", "pippo"
10518 @end example
10519 
10520 @noindent
10521 stampa @samp{pippo@bullet{}}.
10522 
10523 @item @var{spazio}
10524 Applicabile a conversioni numeriche, richiede di inserire uno spazio prima
10525 dei valori positivi e un segno meno prima di quelli negativi.
10526 
10527 @item @code{+}
10528 Il segno pi@`u, usato prima del modificatore di larghezza (si veda pi@`u avanti
10529 in questa lista),
10530 richiede di mettere sempre un segno nelle conversioni numeriche, anche se
10531 il dato da formattare ha valore positivo.  Il @samp{+} prevale sul
10532 modificatore @dfn{spazio}.
10533 
10534 @item @code{#}
10535 Richiede di usare una ``forma alternativa'' per alcune lettere di controllo.
10536 Per @samp{%o}, preporre uno zero.
10537 Per @samp{%x} e @samp{%X}, preporre @samp{0x} o @samp{0X} se il
10538 numero @`e diverso da zero.
10539 Per @samp{%e}, @samp{%E}, @samp{%f}, e @samp{%F}, il risultato deve contenere
10540 sempre un separatore decimale.
10541 Per @code{%g} e @code{%G}, gli zeri finali non significativi non sono
10542 tolti dal numero stampato.
10543 
10544 @item @code{0}
10545 Uno @samp{0} (zero) iniziale serve a richiedere che l'output sia
10546 riempito con zeri (invece che con spazi), prima delle cifre significative.
10547 Questo si applica solo ai formati di output di tipo numerico.
10548 Questo @dfn{flag} ha un effetto solo se la larghezza del campo @`e maggiore
10549 di quella del valore da stampare.
10550 
10551 @item @code{'}
10552 Un carattere di apice singolo o un apostrofo @`e un'estensione POSIX allo
10553 standard ISO C.
10554 Indica che la parte intera di un valore in virgola mobile, o la parte intera
10555 di un valore decimale intero, ha un carattere di separazione delle migliaia.
10556 Ci@`o @`e applicabile solo alle localizzazioni che prevedono un tale carattere.
10557 Per esempio:
10558 
10559 @example
10560 $ @kbd{cat migliaia.awk}          @ii{Visualizza il programma sorgente}
10561 @print{} BEGIN @{ printf "%'d\n", 1234567 @}
10562 $ @kbd{LC_ALL=C gawk -f migliaia.awk}
10563 @print{} 1234567                   @ii{Risultato nella localizzazione} "C"
10564 $ @kbd{LC_ALL=en_US.UTF-8 gawk -f migliaia.awk}
10565 @print{} 1,234,567   @ii{Risultato nella localizzazione UTF inglese americana}
10566 @end example
10567 
10568 @noindent
10569 Per maggiori informazioni relative a localizzazioni e internazionalizzazioni,
10570 si veda @ref{Localizzazioni}.
10571 
10572 @quotation NOTA
10573 Il @dfn{flag} @samp{'} @`e una funzionalit@`a interessante, ma utilizza un
10574 carattere che @`e fonte di complicazioni, perch@'e risulta difficila da usare nei
10575 programmi scritti direttamente sulla riga di comando.  Per informazioni sui
10576 metodi appropriati per gestire la cosa, si veda @ref{Protezione}.
10577 @end quotation
10578 
10579 @item @var{larghezza}
10580 Questo @`e un numero che specifica la larghezza minima che deve occupare un
10581 campo.  L'inserimento di un numero tra il segno @samp{%} e il carattere
10582 di controllo del formato fa s@`{@dotless{i}} che il campo si espanda a quella larghezza.
10583 Il modo di default per fare questo @`e di aggiungere degli spazi a
10584 sinistra.  Per esempio:
10585 
10586 @example
10587 printf "%6s", "pippo"
10588 @end example
10589 
10590 @noindent
10591 stampa @samp{@bullet{}pippo}.
10592 
10593 il valore di @var{larghezza} indica la larghezza minima, non la massima.  Se
10594 il valore dell'elemento richiede pi@`u caratteri della @var{larghezza}
10595 specificata, questa pu@`o essere aumentata secondo necessit@`a.
10596 Quindi, per esempio:
10597 
10598 @example
10599 printf "%6s", "pippo-pluto"
10600 @end example
10601 
10602 @noindent
10603 stampa @samp{pippo-pluto}.
10604 
10605 Anteponendo un segno meno alla @var{larghezza} si richiede che l'output sia
10606 esteso con spazi a destra, invece che a sinistra.
10607 
10608 @item @code{.@var{precisione}}
10609 Un punto, seguito da una costante intera
10610 specifica la precisione da usare nella stampa.
10611 Il tipo di precisione varia a seconda della lettera di controllo:
10612 
10613 @table @asis
10614 @item @code{%d}, @code{%i}, @code{%o}, @code{%u}, @code{%x}, @code{%X}
10615 Minimo numero di cifre da stampare.
10616 
10617 @item @code{%e}, @code{%E}, @code{%f}, @code{%F}
10618 Numero di cifre alla destra del separatore decimale.
10619 
10620 @item @code{%g}, @code{%G}
10621 Massimo numero di cifre significative.
10622 
10623 @item @code{%s}
10624 Massimo numero di caratteri della stringa che possono essere stampati.
10625 @end table
10626 
10627 Quindi, l'istruzione:
10628 
10629 @example
10630 printf "%.4s", "foobar"
10631 @end example
10632 
10633 @noindent
10634 stampa @samp{foob}.
10635 @end table
10636 
10637 Le funzionalit@`a di @var{larghezza} e @var{precisione} dinamiche (cio@`e,
10638 @code{"%*.*s"}) disponibili nell'istruzione @code{printf} della libreria C sono
10639 utilizzabili.
10640 Invece che fornire esplicitamente una @var{larghezza} e/o una @var{precisione}
10641 nella stringa di formato, queste sono fornite come parte della lista degli
10642 argomenti.  Per esempio:
10643 
10644 @example
10645 w = 5
10646 p = 3
10647 s = "abcdefg"
10648 printf "%*.*s\n", w, p, s
10649 @end example
10650 
10651 @noindent
10652 equivale esattamente a:
10653 
10654 @example
10655 s = "abcdefg"
10656 printf "%5.3s\n", s
10657 @end example
10658 
10659 @noindent
10660 Entrambi i programmi stampano @samp{@w{@bullet{}@bullet{}abc}}.
10661 Versioni pi@`u datate di @command{awk} non consentivano questa possibilit@`a.
10662 Dovendo usare una di queste versioni, @`e possibile simulare questa
10663 funzionalit@`a usando la concatenazione per costruire una stringa di formato,
10664 come per esempio:
10665 
10666 @example
10667 w = 5
10668 p = 3
10669 s = "abcdefg"
10670 printf "%" w "." p "s\n", s
10671 @end example
10672 
10673 @noindent
10674 Questo codice non @`e di facile lettura, ma funziona.
10675 
10676 @c @cindex lint checks
10677 @cindex debug @subentry errori fatali @subentry @code{printf}, stringhe di formato
10678 @cindex POSIX @command{awk} @subentry stringhe di formato @code{printf}
10679 Chi programma in C probabilmente @`e abituato a specificare modificatori
10680 addizionali (@samp{h}, @samp{j}, @samp{l}, @samp{L}, @samp{t} e @samp{z}) nelle
10681 stringhe di formato di @code{printf}.  Questi modificatori non sono validi
10682 in @command{awk}.  La maggior parte della implementazioni di @command{awk} li
10683 ignora senza emettere messaggi.  Se si specifica l'opzione @option{--lint}
10684 sulla riga di comando (@pxref{Opzioni}), @command{gawk} emette un messaggio
10685 di avvertimento quando li si usa.  Se si specifica l'opzione @option{--posix},
10686 il loro uso genera un errore fatale.
10687 
10688 @node Esempi su printf
10689 @subsection Esempi d'uso di @code{printf}
10690 
10691 Il seguente semplice esempio mostra
10692 come usare @code{printf} per preparare una tabella allineata:
10693 
10694 @example
10695 awk '@{ printf "%-10s %s\n", $1, $2 @}' mail-list
10696 @end example
10697 
10698 @noindent
10699 Questo comando
10700 stampa i nomi delle persone (@code{$1}) nel file
10701 @file{mail-list} come una stringa di 10 caratteri allineati a sinistra.
10702 Stampa anche i numeri telefonici (@code{$2}) a fianco, sulla stessa riga.
10703 Il risultato @`e una tabella allineata, contenente due colonne, di nomi e numeri
10704 telefonici, come si pu@`o vedere qui:
10705 
10706 @example
10707 $ @kbd{awk '@{ printf "%-10s %s\n", $1, $2 @}' mail-list}
10708 @print{} Amelia     555-5553
10709 @print{} Anthony    555-3412
10710 @print{} Becky      555-7685
10711 @print{} Bill       555-1675
10712 @print{} Broderick  555-0542
10713 @print{} Camilla    555-2912
10714 @print{} Fabius     555-1234
10715 @print{} Julie      555-6699
10716 @print{} Martin     555-6480
10717 @print{} Samuel     555-3430
10718 @print{} Jean-Paul  555-2127
10719 @end example
10720 
10721 In questo caso, i numeri telefonici debbono essere stampati come stringhe,
10722 poich@'e includono un trattino.  Una stampa dei numeri telefonici come numeri
10723 semplici avrebbe visualizzato solo le prime tre cifre: @samp{555},
10724 e questo non sarebbe stato di grande utilit@`a.
10725 
10726 Non era necessario specificare una larghezza per i numeri telefonici poich@'e
10727 sono nell'ultima colonnna di ogni riga.  Non c'@`e bisogno di avere un
10728 allineamento di spazi dopo di loro.
10729 
10730 La tabella avrebbe potuto essere resa pi@`u leggibile aggiungendo
10731 intestazioni in cima
10732 alle colonne.  Questo si pu@`o fare usando una regola @code{BEGIN}
10733 (@pxref{BEGIN/END})
10734 in modo che le intestazioni siano stampate una sola volta, all'inizio del
10735 programma @command{awk}:
10736 
10737 @example
10738 awk 'BEGIN @{ print "Nome      Numero"
10739              print " --- -     ------ " @}
10740            @{ printf "%-10s %s\n", $1, $2 @}' mail-list
10741 @end example
10742 
10743 L'esempio precedente usa sia l'istruzione @code{print} che l'istruzione
10744 @code{printf} nello stesso programma.  Si possono ottenere gli stessi
10745 risultati usando solo istruzioni @code{printf}:
10746 
10747 @example
10748 awk 'BEGIN @{ printf "%-10s %s\n", "Nome", "Numero"
10749              printf "%-10s %s\n", " --- -", " ---  --- " @}
10750            @{ printf "%-10s %s\n", $1, $2 @}' mail-list
10751 @end example
10752 
10753 @noindent
10754 Stampare ogni intestazione di colonna con la stessa specifica di formato
10755 usata per gli elementi delle colonne ci d@`a la certezza che le intestazioni
10756 sono allineate esattamente come le colonne.
10757 
10758 Il fatto che usiamo per tre volte la stessa specifica di formato si pu@`o
10759 evidenziare memorizzandola in una variabile, cos@`{@dotless{i}}:
10760 
10761 @example
10762 awk 'BEGIN @{ format = "%-10s %s\n"
10763              printf format, "Nome", "Numero"
10764              printf format, " --- -", " ---  --- " @}
10765            @{ printf format, $1, $2 @}' mail-list
10766 @end example
10767 
10768 
10769 @node Ridirezione
10770 @section Ridirigere l'output di @code{print} e @code{printf}
10771 
10772 @cindex output @subentry ridirezione
10773 @cindex ridirezione dell'output
10774 @cindex @option{--sandbox} (opzione) @subentry ridirezione dell'output con @code{print}, @code{printf}
10775 @cindex opzione @subentry @option{--sandbox} @subentry ridirezione dell'output con @code{print}, @code{printf}
10776 Finora, l'output di @code{print} e @code{printf} @`e stato diretto
10777 verso lo standard output,
10778 che di solito @`e lo schermo.  Sia @code{print} che @code{printf} possono
10779 anche inviare il loro output in altre direzioni.
10780 @`E quel che si chiama @dfn{ridirezione}.
10781 
10782 @quotation NOTA
10783 Quando si specifica @option{--sandbox} (@pxref{Opzioni}),
10784 la ridirezione dell'output verso file, @dfn{pipe} e coprocessi non @`e
10785 consentita.
10786 @end quotation
10787 
10788 Una ridirezione @`e posta dopo l'istruzione @code{print} o @code{printf}.
10789 Le ridirezioni in @command{awk} sono scritte come le ridirezioni nei
10790 comandi della shell, l'unica differenza @`e che si trovano all'interno di
10791 un programma @command{awk}.
10792 
10793 @c the commas here are part of the see also
10794 @cindex istruzione @subentry @code{print} @seealso{ridirezione dell'output}
10795 @cindex istruzione @subentry @code{printf} @seealso{ridirezione dell'output}
10796 Ci sono quattro forme di ridirezione dell'output:
10797 output scritto su un file,
10798 output aggiunto in fondo a un file,
10799 output che fa da input a un altro comando (usando una @dfn{pipe}) e
10800 output diretto a un coprocesso.
10801 Vengono descritti per l'istruzione @code{print},
10802 ma funzionano allo stesso modo per @code{printf}:
10803 
10804 @table @code
10805 @cindex @code{>} (parentesi acuta destra) @subentry operatore @code{>} (I/O)
10806 @cindex parentesi @subentry acuta destra (@code{>}) @subentry operatore @code{>} (I/O)
10807 @cindex operatori @subentry input/output
10808 @item print @var{elementi} > @var{output-file}
10809 Questa ridirezione stampa gli elementi nel file di output chiamato
10810 @var{output-file}.  Il @value{FN} @var{output-file} pu@`o essere
10811 una qualsiasi espressione.  Il suo valore @`e trasformato in una stringa e
10812 quindi usato come
10813 @iftex
10814 @value{FN} (@pxrefil{Espressioni}).
10815 @end iftex
10816 @ifnottex
10817 @value{FN} (@pxref{Espressioni}).
10818 @end ifnottex
10819 Quando si usa questo tipo di ridirezione, il file @var{output-file} viene
10820 cancellato prima che su di esso sia stato scritto il primo record in uscita.
10821 Le successive scritture verso lo stesso file @var{output-file} non cancellano
10822 @var{output-file}, ma continuano ad aggiungervi record.
10823 (Questo comportamento @`e differente da quello delle ridirezioni usate negli
10824 script della shell.)
10825 Se @var{output-file} non esiste, viene creato.  Per esempio, ecco
10826 come un programma @command{awk} pu@`o scrivere una lista di nomi di persone
10827 su un file di nome @file{lista-nomi}, e una lista di numeri telefonici
10828 su un altro file di nome @file{lista-telefoni}:
10829 
10830 @example
10831 $ @kbd{awk '@{ print $2 > "lista-telefoni"}
10832 >        @kbd{print $1 > "lista-nomi" @}' mail-list}
10833 $ @kbd{cat lista-telefoni}
10834 @print{} 555-5553
10835 @print{} 555-3412
10836 @dots{}
10837 $ @kbd{cat lista-nomi}
10838 @print{} Amelia
10839 @print{} Anthony
10840 @dots{}
10841 @end example
10842 
10843 @noindent
10844 Ogni file in output contiene un nome o un numero su ogni riga.
10845 
10846 @cindex @code{>} (parentesi acuta destra) @subentry operatore @code{>>} (I/O)
10847 @cindex parentesi @subentry acuta destra (@code{>}) @subentry operatore @code{>>} (I/O)
10848 @item print @var{elementi} >> @var{output-file}
10849 Questa ridirezione stampa gli elementi in un file di output preesistente,
10850 di nome @var{output-file}.  La differenza tra questa ridirezione e quella
10851 con un solo @samp{>} @`e che il precedente contenuto (se esiste) di
10852 @var{output-file} non viene cancellato.  Invece, l'output di @command{awk} @`e
10853 aggiunto in fondo al file.
10854 Se @var{output-file} non esiste, viene creato.
10855 
10856 @cindex @code{|} (barra verticale) @subentry operatore @code{|} (I/O)
10857 @cindex @dfn{pipe} @subentry output
10858 @cindex output @subentry a @dfn{pipe}
10859 @item print @var{elementi} | @var{comando}
10860 @`E possibile inviare output a un altro programma usando una @dfn{pipe}
10861 invece di inviarlo a un file.   Questa ridirezione apre una @dfn{pipe} verso
10862 @var{comando}, e invia i valori di @var{elementi}, tramite questa
10863 @dfn{pipe}, a un altro processo creato per eseguire @var{comando}.
10864 
10865 L'argomento @var{comando}, verso cui @`e rivolta la ridirezione, @`e in realt@`a
10866 un'espressione
10867 @command{awk}.  Il suo valore @`e convertito in una stringa il cui contenuto
10868 costituisce un comando della shell che deve essere eseguito.  Per esempio,
10869 il seguente programma produce due file, una lista non ordinata di nomi di
10870 persone e una lista ordinata in ordine alfabetico inverso:
10871 
10872 @ignore
10873 10/2000:
10874 This isn't the best style, since COMMAND is assigned for each
10875 record.  It's done to avoid overfull hboxes in TeX.  Leave it
10876 alone for now and let's hope no-one notices.
10877 @end ignore
10878 
10879 @example
10880 @group
10881 awk '@{ print $1 > "nomi.non.ordinati"
10882        comando = "sort -r > nomi.ordinati"
10883        print $1 | comando @}' mail-list
10884 @end group
10885 @end example
10886 
10887 La lista non ordinata @`e scritta usando una ridirezione normale, mentre
10888 la lista ordinata @`e scritta inviando una @dfn{pipe} in input al programma
10889 di utilit@`a @command{sort}.
10890 
10891 Il prossimo esempio usa la ridirezione per inviare un messaggio alla
10892 mailing list @code{bug-sistema}.  Questo pu@`o tornare utile se si hanno
10893 problemi con uno @dfn{script} @command{awk} eseguito periodicamente per la
10894 manutenzione del sistema:
10895 
10896 @example
10897 report = "mail bug-sistema"
10898 print("Script awk in errore:", $0) | report
10899 print("al record numero", FNR, "di", NOME_FILE) | report
10900 close(report)
10901 @end example
10902 
10903 La funzione @code{close()} @`e stata chiamata perch@'e @`e una buona idea chiudere
10904 la @dfn{pipe} non appena tutto l'output da inviare alla @dfn{pipe} @`e stato
10905 inviato.  @xref{Chiusura file e @dfn{pipe}}
10906 per maggiori informazioni.
10907 
10908 Questo esempio illustra anche l'uso di una variabile per rappresentare
10909 un @var{file} o un @var{comando}; non @`e necessario usare sempre
10910 una costante stringa.  Usare una variabile @`e di solito una buona idea,
10911 perch@'e (se si vuole riusare lo stesso file o comando)
10912 @command{awk} richiede che il valore della stringa sia sempre scritto
10913 esattamente nello stesso modo.
10914 
10915 @cindex coprocessi
10916 @cindex @code{|} (barra verticale) @subentry operatore @code{|&} (I/O)
10917 @cindex operatori @subentry input/output
10918 @cindex differenze tra @command{awk} e @command{gawk} @subentry operatori di input/output
10919 @item print @var{elementi} |& @var{comando}
10920 Questa ridirezione stampa gli elementi nell'input di @var{comando}.
10921 La differenza tra questa ridirezione  e quella
10922 con la sola @samp{|} @`e che l'output da @var{comando}
10923 pu@`o essere letto tramite @code{getline}.
10924 Quindi, @var{comando} @`e un @dfn{coprocesso}, che lavora in parallelo al
10925 programma @command{awk}, ma @`e al suo servizio.
10926 
10927 Questa funzionalit@`a @`e un'estensione @command{gawk}, e non @`e disponibile in
10928 POSIX @command{awk}.
10929 @ifnotdocbook
10930 @xref{Getline coprocesso},
10931 per una breve spiegazione.
10932 @ref{I/O bidirezionale}
10933 per un'esposizione pi@`u esauriente.
10934 @end ifnotdocbook
10935 @ifdocbook
10936 @xref{Getline coprocesso}
10937 per una breve spiegazione.
10938 @xref{I/O bidirezionale}
10939 per un'esposizione pi@`u esauriente.
10940 @end ifdocbook
10941 @end table
10942 
10943 Ridirigere l'output usando @samp{>}, @samp{>>}, @samp{|} o @samp{|&}
10944 richiede al sistema di aprire un file, una @dfn{pipe} o un coprocesso solo se
10945 il particolare @var{file} o @var{comando} che si @`e specificato non @`e gi@`a
10946 stato utilizzato in scrittura dal programma o se @`e stato chiuso
10947 dopo l'ultima scrittura.
10948 
10949 @cindex debug @subentry stampare
10950 @`E un errore comune usare la ridirezione @samp{>} per la prima istruzione
10951 @code{print} verso un file, e in seguito usare @samp{>>} per le successive
10952 scritture in output:
10953 
10954 @example
10955 # inizializza il file
10956 print "Non v'allarmate" > "guida.txt"
10957 @dots{}
10958 # aggiungi in fondo al file
10959 print "Evitate generatori di improbabilit@`a" >> "guide.txt"
10960 @end example
10961 
10962 @noindent
10963 Questo @`e il modo in cui le ridirezioni devono essere usate lavorando
10964 con la shell.  Ma in @command{awk} ci@`o non @`e necessario.  In casi di questo
10965 genere, un programma dovrebbe
10966 usare @samp{>} per tutte le istruzioni @code{print}, perch@'e il file di
10967 output @`e aperto una sola volta.
10968 (Usando sia @samp{>} che @samp{>>} nello stesso programma, l'output @`e prodotto
10969 nell'ordine atteso.
10970 Tuttavia il mischiare gli operatori per lo stesso file @`e sintomo di uno
10971 stile di programmazione inelegante, e pu@`o causare confusione in chi legge
10972 il programma.)
10973 
10974 @cindex differenze tra @command{awk} e @command{gawk} @subentry limitazioni di implementazione
10975 @cindex problemi di implementazione @subentry @command{gawk} @subentry limitazioni
10976 @cindex @command{awk} @subentry problemi di implementazione @subentry @dfn{pipe}
10977 @cindex @command{gawk} @subentry problemi di implementazione @subentry @dfn{pipe}
10978 @ifnotinfo
10979 Come visto in precedenza
10980 (@pxref{Note su getline}),
10981 molte
10982 @end ifnotinfo
10983 @ifnottex
10984 @ifnotdocbook
10985 @ifnothtml
10986 Molte
10987 @end ifnothtml
10988 @end ifnotdocbook
10989 @end ifnottex
10990 tra le pi@`u vecchie implementazioni di
10991 @command{awk} limitano il numero di @dfn{pipeline} che un programma
10992 @command{awk} pu@`o mantenere aperte a una soltanto!  In @command{gawk}, non c'@`e
10993 un tale limite.  @command{gawk} consente a un programma di
10994 aprire tante @dfn{pipeline} quante ne consente il sistema operativo su cui
10995 viene eseguito.
10996 
10997 @sidebar Inviare @dfn{pipe} alla @command{sh}
10998 @cindex shell @subentry inviare comandi tramite @dfn{pipe} alla
10999 
11000 Una maniera particolarmente efficace di usare la ridirezione @`e quella di
11001 preparare righe di comando da passare
11002 come @dfn{pipe} alla shell,
11003 @command{sh}.  Per esempio, si supponga di avere una lista di file provenienti
11004 da un sistema in cui tutti i
11005 @value{FNS} sono memorizzari in maiuscolo, e  di volerli rinominare
11006 in modo da avere nomi tutti in
11007 minuscolo.  Il seguente programma @`e
11008 sia semplice che efficiente:
11009 
11010 @c @cindex @command{mv} utility
11011 @example
11012 @{ printf("mv %s %s\n", $0, tolower($0)) | "sh" @}
11013 
11014 END @{ close("sh") @}
11015 @end example
11016 
11017 La funzione @code{tolower()} restituisce la stringa che gli viene passata
11018 come argomento con tutti i caratteri maiuscoli convertiti in minuscolo
11019 (@pxref{Funzioni per stringhe}).
11020 Il programma costruisce una lista di righe di comando,
11021 usando il programma di utilit@`a @command{mv} per rinominare i file.
11022 Poi invia la lista alla shell per l'elaborazione.
11023 
11024 @xref{Apici alla shell} per una funzione che pu@`o essere utile nel generare
11025 righe di comando da passare alla shell.
11026 @end sidebar
11027 
11028 @node FD speciali
11029 @section File speciali per flussi standard di dati pre-aperti
11030 @cindex standard input
11031 @cindex input @subentry standard
11032 @cindex standard output
11033 @cindex output @subentry standard
11034 @cindex errore @subentry in output
11035 @cindex standard error
11036 @cindex descrittori di file
11037 @cindex file @subentry descrittori @seeentry{descrittori di file}
11038 
11039 I programmi in esecuzione hanno convenzionalmente tre flussi di input e
11040 output a disposizione, gi@`a aperti per la lettura e la scrittura.
11041 Questi sono noti come
11042 lo @dfn{standard input}, lo @dfn{standard output} e lo @dfn{standard
11043 error output}.  A questi flussi aperti (e a tutti gli altri file aperti o
11044 @dfn{pipe}) si fa spesso riferimento usando il termine tecnico
11045 @dfn{descrittori di file} [FD].
11046 
11047 Questi flussi sono, per default, associati alla tastiera e allo schermo,
11048 ma spesso sono ridiretti, nella shell, utilizzando gli operatori
11049 @samp{<}, @samp{<<}, @samp{>}, @samp{>>}, @samp{>&} e @samp{|}.
11050 Lo standard error @`e tipicamente usato per scrivere messaggi di errore;
11051 la ragione per cui ci sono due flussi distinti,
11052 standard output e standard error, @`e per poterli ridirigere indipendentemente
11053 l'uno dall'altro.
11054 
11055 @cindex differenze tra @command{awk} e @command{gawk} @subentry messaggi di errore
11056 @cindex gestione errori
11057 @cindex errori @subentry gestione degli
11058 Nelle tradizionali implementazioni di @command{awk}, il solo modo per
11059 scrivere un messaggio di errore allo
11060 standard error in un programma @command{awk} @`e il seguente:
11061 
11062 @example
11063 print "Ho trovato un errore grave!" | "cat 1>&2"
11064 @end example
11065 
11066 @noindent
11067 Con quest'istruzione si apre una @dfn{pipeline} verso un comando della shell
11068 che @`e in grado di accedere al flusso di standard error che eredita dal
11069 processo @command{awk}.
11070 @c 8/2014: Mike Brennan says not to cite this as inefficient. So, fixed.
11071 Questo @`e molto poco elegante, e richiede anche di innescare un processo
11072 separato.  Per questo chi scrive programmi @command{awk} spesso
11073 non usa questo metodo.  Invece, invia i messaggi di errore allo
11074 schermo, in questo modo:
11075 
11076 @example
11077 print "Ho trovato un errore grave!" > "/dev/tty"
11078 @end example
11079 
11080 @noindent
11081 (@file{/dev/tty} @`e un file speciale fornito dal sistema operativo
11082 ed @`e connesso alla tastiera e allo schermo.  Rappresenta il
11083 ``terminale'',@footnote{``tty'' in @file{/dev/tty} @`e un'abbreviazione di
11084 ``TeleTYpe'' [telescrivente], un terminale seriale.} che nei sistemi odierni
11085 @`e una tastiera e uno schermo, e non una @dfn{console} seriale).
11086 Questo ha generalmente lo stesso effetto, ma non @`e sempre detto: sebbene il
11087 flusso di standard error sia solitamente diretto allo schermo, potrebbe
11088 essere stato
11089 ridiretto; se questo @`e il caso, scrivere verso lo schermo non serve.  In
11090 effetti, se @command{awk} @`e chiamato da un lavoro che non @`e eseguito
11091 interattivamente,
11092 pu@`o non avere a disposizione alcun terminale su cui scrivere.
11093 In quel caso, l'apertura di @file{/dev/tty} genera un errore.
11094 
11095 @command{gawk}, BWK @command{awk}, e @command{mawk} mettono a disposizione
11096 speciali @value{FNS} per accedere ai tre flussi standard.
11097 Se il @value{FN} coincide con uno di questi nomi speciali, quando
11098 @command{gawk} (o uno degli altri) ridirige l'input o l'output, usa
11099 direttamente il descrittore di file identificato dal @value{FN}.  Questi
11100 @value{FNS} sono gestiti cos@`{@dotless{i}} in tutti i sistemi operativi nei quali
11101 @command{gawk} @`e disponibile, e non solo in quelli che aderiscono allo
11102 standard POSIX:
11103 
11104 @cindex estensioni comuni @subentry file speciale @code{/dev/stdin}
11105 @cindex estensioni comuni @subentry file speciale @code{/dev/stdout}
11106 @cindex estensioni comuni @subentry file speciale @code{/dev/stderr}
11107 @cindex nomi @subentry di file @subentry flussi standard in @command{gawk}
11108 @cindex @code{/dev/@dots{}}, file speciali
11109 @cindex file @subentry speciali @subentry @code{/dev/@dots{}}
11110 @cindex @code{/dev/fd/@var{N}}, file speciali (in @command{gawk})
11111 @table @file
11112 @item /dev/stdin
11113 Lo standard input (descrittore di file 0).
11114 
11115 @item /dev/stdout
11116 Lo standard output (descrittore di file 1).
11117 
11118 @item /dev/stderr
11119 Lo standard error output (descrittore di file 2).
11120 @end table
11121 
11122 Usando questa funzionalit@`a
11123 la maniera corretta di scrivere un messaggio di errore diviene quindi:
11124 
11125 @example
11126 print "Ho trovato un errore grave!" > "/dev/stderr"
11127 @end example
11128 
11129 @cindex debug @subentry doppio apice con nomi di file
11130 Si noti l'uso di doppi apici per racchiudere il @value{FN}.
11131 Come per ogni altra ridirezione, il valore dev'essere una stringa.
11132 @`E un errore comune omettere i doppi apici, il che conduce a
11133 risultati inattesi.
11134 
11135 @command{gawk} non tratta questi @value{FNS} come speciali quando opera
11136 in modalit@`a di compatibilit@`a POSIX.  Comunque, poich@'e BWK @command{awk}
11137 li prevede, @command{gawk} li ammette anche quando viene
11138 invocato con l'opzione @option{--traditional} (@pxref{Opzioni}).
11139 
11140 @node File speciali
11141 @section @value{FFNS} speciali in @command{gawk}
11142 @cindex @command{gawk} @subentry nomi di file in
11143 
11144 Oltre all'accesso a standard input, standard output e standard error,
11145 @command{gawk} consente di accedere a ogni descrittore di file aperto.
11146 In pi@`u, ci sono dei @value{FNS} speciali riservati per accedere a
11147 reti TCP/IP.
11148 
11149 @menu
11150 * Altri file ereditati::        Accedere ad altri file aperti con
11151                                 @command{gawk}.
11152 * Reti speciali::               File speciali per comunicazioni con la rete.
11153 * Avvertimenti speciali::       Cose a cui prestare attenzione.
11154 @end menu
11155 
11156 @node Altri file ereditati
11157 @subsection Accedere ad altri file aperti con @command{gawk}
11158 
11159 Oltre ai valori speciali di @value{FNS}
11160 @code{/dev/stdin}, @code{/dev/stdout} e @code{/dev/stderr}
11161 gi@`a menzionati, @command{gawk} prevede una sintassi
11162 per accedere a ogni altro file aperto ereditato:
11163 
11164 @table @file
11165 @item /dev/fd/@var{N}
11166 Il file associato al descrittore di file @var{N}.  Il file indicato deve
11167 essere aperto dal programma che inizia l'esecuzione di @command{awk}
11168 (tipicamente la shell).  Se non sono state poste in essere iniziative
11169 speciali nella shell da cui @command{gawk} @`e stato invocato, solo i
11170 descrittori 0, 1, e 2 sono disponibili.
11171 @end table
11172 
11173 I @value{FNS} @file{/dev/stdin}, @file{/dev/stdout} e @file{/dev/stderr}
11174 sono essenzialmente alias per @file{/dev/fd/0}, @file{/dev/fd/1} e
11175 @file{/dev/fd/2}, rispettivamente. Comunque, i primi nomi sono pi@`u
11176 autoesplicativi.
11177 
11178 Si noti che l'uso di @code{close()} su un @value{FN} della forma
11179 @code{"/dev/fd/@var{N}"}, per numeri di descrittore di file
11180 oltre il due, effettivamente chiude il descrittore di file specificato.
11181 
11182 @node Reti speciali
11183 @subsection File speciali per comunicazioni con la rete
11184 @cindex reti @subentry funzionalit@`a per
11185 @cindex TCP/IP @subentry funzionalit@`a per
11186 
11187 I programmi @command{gawk}
11188 possono aprire una connessione bidirezionale
11189 TCP/IP, fungendo o da @dfn{client} o da @dfn{server}.
11190 Questo avviene usando uno speciale @value{FN} della forma:
11191 
11192 @example
11193 @file{/@var{tipo-rete}/@var{protocollo}/@var{porta-locale}/@var{host-remoto}/@var{porta-remota}}
11194 @end example
11195 
11196 Il @var{tipo-rete} pu@`o essere @samp{inet}, @samp{inet4} o @samp{inet6}.
11197 Il @var{protocollo} pu@`o essere @samp{tcp} o @samp{udp},
11198 e gli altri campi rappresentano gli altri dati essenziali
11199 necessari per realizzare una connessione di rete.
11200 Questi @value{FNS} sono usati con l'operatore @samp{|&} per comunicare
11201 con @w{un coprocesso}
11202 (@pxref{I/O bidirezionale}).
11203 Questa @`e una funzionalit@`a avanzata, qui riferita solo per completezza.
11204 Una spiegazione esauriente sar@`a fornita nella
11205 @ref{Reti TCP/IP}.
11206 
11207 @node Avvertimenti speciali
11208 @subsection Avvertimenti speciali sui @value{FNS}
11209 
11210 Sono qui elencate alcune cose da tener presente usando i
11211 @value{FNS} speciali forniti da @command{gawk}:
11212 
11213 @itemize @value{BULLET}
11214 @cindex modalit@`a compatibile di (@command{gawk}) @subentry nomi di file
11215 @cindex nomi @subentry di file @subentry nella modalit@`a compatibile di @command{gawk}
11216 @cindex modalit@`a POSIX 
11217 @item
11218 Il riconoscimento dei @value{FNS} per i tre file standard pre-aperti
11219 @`e disabilitato solo in modalit@`a POSIX.
11220 
11221 @item
11222 Il riconoscimento degli altri @value{FNS} speciali @`e disabilitato se
11223 @command{gawk} @`e in modalit@`a compatibile
11224 (o @option{--traditional} o @option{--posix};
11225 @pxref{Opzioni}).
11226 
11227 @item
11228 @command{gawk} interpreta @emph{sempre}
11229 questi @value{FNS} speciali.
11230 Per esempio, se si usa @samp{/dev/fd/4}
11231 per l'output, si scrive realmente sul descrittore di file 4, e non su un nuovo
11232 descrittore di file generato duplicando (con @code{dup()}) il descrittore
11233 file 4.  Solitamente questo non ha importanza; comunque, @`e importante
11234 @emph{non} chiudere alcun file correlato ai descrittori di file 0, 1 e 2.
11235 Se lo si fa, il comportamente risultante @`e imprevedibile.
11236 @end itemize
11237 
11238 @node Chiusura file e @dfn{pipe}
11239 @section Chiudere ridirezioni in input e in output
11240 @cindex output @subentry file in
11241 @cindex input @subentry chiusura
11242 @cindex file @subentry in output @subentry chiusura di
11243 @cindex @dfn{pipe} @subentry chiusura
11244 @cindex coprocessi @subentry chiusura
11245 @cindex @code{getline} (comando) @subentry coprocessi, usare da
11246 
11247 Se lo stesso @value{FN} o lo stesso comando di shell @`e usato con @code{getline}
11248 pi@`u di una volta durante l'esecuzione di un programma @command{awk}
11249 (@pxref{Getline}),
11250 il file viene aperto (o il comando viene eseguito) solo la prima volta.
11251 A quel punto, il primo record in input @`e letto da quel file o comando.
11252 La prossima volta che lo stesso file o comando @`e usato con @code{getline},
11253 un altro record @`e letto da esso, e cos@`{@dotless{i}} via.
11254 
11255 Analogamente, quando un file o una @dfn{pipe} sono aperti in output,
11256 @command{awk} ricorda
11257 il @value{FN} o comando a essi associato, e le successive
11258 scritture verso lo stesso file o comando sono accodate alle precedenti
11259 scritture.
11260 Il file o la @dfn{pipe} rimangono aperti fino al termine dell'esecuzione
11261 di @command{awk}.
11262 
11263 @cindexawkfunc{close}
11264 Questo implica che sono necessari dei passi speciali per rileggere nuovamente
11265 lo stesso file dall'inizio, o per eseguire di nuovo un comando di shell
11266 (invece che leggere ulteriore output dal precedente comando).  La funzione
11267 @code{close()} rende possibile fare queste cose:
11268 
11269 @example
11270 close(@var{NOME_FILE})
11271 @end example
11272