Domanda

Voglio fare qualcosa del genere:

for i in 1 2 3
do
   gawk '{if ($i==$2) {print <*>;}}' filename
done

è possibile?

grazie

È stato utile?

Soluzione

Mi vengono in mente due possibili interpretazioni della tua sceneggiatura:

  1. In realtà vuoi cercare "1", "2", quindi "3" come secondo campo in filename
  2. In realtà vuoi cercare il primo parametro dello script della shell, quindi il secondo, ...

Ecco entrambe le versioni del loop:

for i in 1 2 3; do 
   gawk "{if (\"$i\"==\$2) {print \<*>;}}" filename
done
for i in "$@"; do
   gawk "{if (\"$i\"==\$2) {print \<*>;}}" filename
done

Altri suggerimenti

Per evitare brutte citazioni, puoi usare la funzione di passaggio variabile di gawk:

for i in 1 2 3
do
    gawk -v param=$i '{if (param==$2) {print <*>}}' filename
done

Supponendo che si desideri che lo script gawk sia

{if ($1 == $2 ) ... }
{if ($2 == $2 ) ... }
{if ($3 == $2 ) ... }

puoi fare:

for i in 1 2 3
do
   gawk '{if ($i'==$2) {print <*>;}}' filename
done

Beh, certo, è possibile, ma probabilmente non farà ciò che vuoi che faccia.

... vieni a pensarci, cosa fai che vuoi che faccia? Non è molto chiaro da quello che hai scritto. Una cosa che probabilmente dovrai cambiare è sostituire le virgolette singole con virgolette doppie perché le variabili (come $ i ) non vengono sostituite in stringhe tra virgolette singole.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top