Newsgroup: it.comp.os.linux.development
Titolo: gawk in uno script bash: come gestire $1, $2, ... ?

Devo usare gawk in uno script bash in questo modo:
gawk '{print $1}' nomefile | sort > nomefile_ordinato
La shell interpreta $1 come il primo parametro passatole dalla command
line, mentre a me serve che gawk stampi il primo campo di nomefile:
come posso dire alla shell di passare a gawk il comando '{print $1}'
senza sostituire $1 con il parametro posizionale?
Ho provato con '{print \$1}' e con  '{print '$1'}' ma nessuno di
questi funziona.
Z24 

 senza sostituire $1 con il parametro posizionale?
Se non ho capito male.....
$  head -n 1 nomefile | gawk '{print $1}' | sort > nomefile_ordinato
Ciao.
-- 
***  Per E-mail rimuovi ModE dall'indirizzo  ***
              *** ICQ 33500725 ***
*** homepage 
http://web.tiscalinet.it/kailed
 ***
            *** Powered by Linux ***

 $  head -n 1 nomefile | gawk '{print $1}' | sort > nomefile_ordinato
'Azz.... se la prima riga č vuota????? Ci vuole *decisamente* una soluzione
migliore....-(


Ciao.
Ciao.
Z24

 line, mentre a me serve che gawk stampi il primo campo di nomefile:
Che shell usi? La bash non ha questo assurdo comportamento.
(ho provato sia da prompt che da script)
-- 
Linux Users Group Trieste 
http://trieste.linux.it

come posso dire alla shell di passare a gawk il comando '{print $1}'
Posta un esempio che si possa provare; io ho fatto una prova e funziona
come previsto, magari non ho capito bene come lo usi tu.
-- 
giu...@pobox.com

...
Cosě dovrebbe essere ok:
$ cat nomefile | gawk '{print $1}' | sort > file_ordinato


Ho risolto il problema: non dipende dall'istruzione in sè ma dal fatto
che ho tentato di mettere l'istruzione (non il risultato
dell'istruzione) in una variabile per usarla come le macro in C:
CMD="gawk '{print $1}' nomefile"
echo $CMD | sort > nomefile_ordinato
ma è sbagliato.
C'è un modo per farlo? Siccome l'istruzione   gawk '{print $1}'
nomefile   viene usata in diverse parti dello script e nomefile
cambia, non vorrei ripeterla sempre.
Grazie e scusate per la perdita di tempo.
Z24

 C'č un modo per farlo? 
sicuro: al posto di "echo" nella seconda linea usa "eval"
Ciao,
Fabio Alemagna

Fabio Alemagna
Ciao
Z24

 echo $CMD | sort > nomefile_ordinato
CMD="gawk '{print $1}' nomefile"
"$CMD" | sort > nomefile_ordinato


cambia, non vorrei ripeterla sempre.
Forse sarebbe meglio se postassi questo benedetto script. Comunque:
* N.B. Che ci crediate o no, mi s'e' fulminata la motherboard del
* Linux, e l'ho sostituita con una modificata a colpi di saldatore
* dove pero' il dissipatore non ci sta. Dopo cena, arriva un amico
* col flessibile, e sistemiamo il dissipatore ;-) - fino ad allora
* non ho accesso ad una bash. A memoria, dovrebbe funzionare.
sortfirstword()
{
	gawk "{print \$1}" $1 | sort > ${1}_ordinato
# Alternative
#	cut -f1 < $1 | sort > ${1}_ordinato
#	... > $2 :-)
# Rimozione duplicati
#	... | uniq | sort > ...
}
# Ordinare le prime parole di pippero dentro pippero_ordinato
sortfirstword pippero
# Ora la stessa cosa per capasanta
sortfirstword capasanta
# ecc.
Leonardo
".signature": bad command or file name

	gawk "{print \$1}" $1 | sort > ${1}_ordinato
Ho provato con questo script:
#!/bin/sh
CMD="gawk '{print \$1}' nomefile"
eval $CMD | sort > nomefile_ordinato
e funziona. Poi ho provato a fare le stesse modifiche nel mio script
(v. sotto) ma ho ancora problemi (bash: $4: Command not found),
probabilmente dipende da qualcos'altro.
Un altro problema: sembra che gawk usi come separatore di campo anche
( e ). C'č un modo per dirgli di non usare le parentesi o di usare
solo lo spazio?
------ script ---------
Lo script make_batch deve confrontare data e ora di ogni file presente
in C:\mydir\Z24 e nelle sottodir con il suo corrispondente file
presente in D:\Z24 (il cd che uso come backup) e deve creare un file
batch per DOS che copia i file piů recenti da D: a C: o da C: a D:
(con i driver HP del masterizzatore posso fare un 'COPY C:\file D:\'
tramite prompt del DOS). Mi serve per allineare i file su pc, notebook
e cd.
Dopo aver creato 3 file da dos con i comandi 
DIR /A/S/O:GN/4 c:\mydir\Z24 > dir_pc
DIR /A/S/O:GN/4 d:\Z24 > dir_cd
DIR /A/S/O:GN/4 c:\dir1\dir2\Z24 > dir_nb
viene lanciato lo script da linux con
make_batch pc > batch.bat
per creare il batch che allinea pc e cd
oppure con
make_batch nb > batch.bat
per creare il batch che allinea notebook e cd
---------------- make_batch ----------------------
#!/bin/sh
if [ $# -eq 0 ] ; then 
   echo "Usage: $0 whichpc "
   echo "where 'whichpc' is either 'pc' or 'nb'"
   echo "This script compares directory whichpc\Z24 with D:\Z24 and
creates a" 
   echo "DOS batch that copies newer existing or non-existing files to
either"
   echo "pc / nb or cd, replacing eventually existing older files"
else
   # creazione log
   rm -f batch_log
   touch batch_log
   # estrazione sottodir, nome file e data
   gawk -f dirconv dir_$1 > dir_$1_awk
   gawk -f dirconv dir_cd > dir_cd_awk
   # i file in dir_$1_awk hanno questi campi:
   # dir/nomelungowin95 nome8car.ext size date time
   # estrazione dir principale Z24 per pc / nb e cd
   # DIR1=c:\mydir\, DIR2=d:\
   DIR1=`head -n 7 dir_$1 | gawk '$1=="Directory" {print
substr($3,1,match($3,"Z24")-1)}'`
   DIR2=`head -n 7 dir_cd | gawk '$1=="Directory" {print
substr($3,1,match($3,"Z24")-1)}'`
   # macro
   CMD1="gawk '{print \$6\$1 " " \$4 " " \$5}'"
   CMD2="gawk '{print \$1 " " \$4 " " \$5}'"
   # file comuni ma diversi (presenti sia su cd sia su pc / nb ma con
data o dimensione diversa)
   echo "@echo off"
   echo "echo Files presenti sia su $1 sia su cd"
   gawk '{print $1}' dir_$1_awk | sort > dir_$1_sort
   gawk '{print $1}' dir_cd_awk | sort > dir_cd_sort
   for FILENAME in `comm -12 dir_$1_sort dir_cd_sort` ; do 
      echo $FILENAME >> batch_log
      FILE1=`fgrep -w "$FILENAME" dir_$1_awk`
      FILE2=`fgrep -w "$FILENAME" dir_cd_awk`
      # dateconv converte data e ora dai formati it e us del dos in
yyyymmddhhmm per poter fare il confronto
      DATE1=`echo $FILE1 | awk '{print $4 " " $5}' | gawk -f dateconv`
      DATE2=`echo $FILE2 | awk '{print $4 " " $5}' | gawk -f dateconv`
      # in dir_$1_awk ho sostituito nel nome lungo del file, che puň
avere anche degli spazi, " " con "*", quindi ora devo riportarlo come
prima
      F_NAME1=`echo $FILE1 | gawk '{gsub("*"," ",$1); print $0}'`
      F_NAME2=`echo $FILE2 | gawk '{gsub("*"," ",$1); print $0}'`
      if [ $DATE1 -gt $DATE2 ] ; then
        echo "echo `echo $F_NAME1 | gawk '{print $6$1 " " $4 " "
$5}'`"
        echo "echo ---> $DIR2`echo $F_NAME2 | gawk '{print $1 " " $4 "
" $5}'`"
        echo "COPY `echo $F_NAME1 | gawk '{print $6$1}'` $DIR2`echo
$F_NAME2 | gawk '{print $1}'`"
      else
        if [ $DATE1 -lt $DATE2 ] ; then
          echo "echo `echo $F_NAME2 | eval $CMD1`"
          echo "echo ---> $DIR1`echo $F_NAME1 | eval $CMD2`"
          echo "COPY `echo $F_NAME2 | gawk '{print $6$1}'` $DIR1`echo
$F_NAME1 | gawk '{print $1}'`"
        fi
      fi
   done   
   # file presenti solo su pc / nb
   echo "echo Files presenti solo su $1"
   for FILENAME in `comm -23 dir_$1_sort dir_cd_sort` ; do
      echo $FILENAME >> batch_log
      F_NAME=`fgrep -w "$FILENAME" dir_$1_awk | gawk '{gsub("*","
",$1); print $0}'`
      echo "echo `echo $F_NAME | eval $CMD1`"
      echo "echo ---> $DIR2`echo $F_NAME | gawk '{print $1}'`"
      echo "COPY `echo $F_NAME | gawk '{print $6$1}'` $DIR2`echo
$F_NAME | gawk '{print $1}'`"
   done
   # file presenti solo su cd 
   echo "echo Files presenti solo su cd"
   for FILENAME in `comm -13 dir_$1_sort dir_cd_sort` ; do
      echo $FILENAME >> batch_log
      F_NAME=`fgrep -w "$FILENAME" dir_cd_awk | gawk '{gsub("*","
",$1); print $0}'`
      echo "echo `echo $F_NAME | eval $CMD1`"
      echo "echo ---> $DIR1`echo $F_NAME | gawk '{print $1}'`"
      echo "COPY `echo $F_NAME | gawk '{print $6$1}'` $DIR1`echo
$F_NAME | gawk '{print $1}'`"
   done
fi
----------- fine make_batch ----------------------
Se interessa posso postare anche dirconv e dateconv
Grazie per l'aiuto.
Ciao
Z24

 "$CMD" | sort > nomefile_ordinato
Mia cazzata; funziona solo quando contiene un solo comando.


e cd.
Ah, a questi livelli di solito io uso il C.
