Come funziona questo script AWK?

0

Ho 2 file di dati contenenti ciascuno una colonna. Voglio creare un altro file di dati unendo entrambe le colonne. Ho la riga di comando nella shell ma non so come funzioni.

Spiega in modo dettagliato il seguente comando:

awk 'NR==FNR {a[i++]=$0};
             {b[x++]=$0;};{k=x-i};
     END     {for(j=0;j<i;) print a[j++],b[k++]}' \
  file1.txt file2.txt

Esempio:

ingresso:

file1.txt   
11
23
19
31
67
file2.txt
13
19
25
67
93

Ho usato il comando precedente per scrivere uno script di shell e ho ottenuto l'output seguente:

11 13
23 19
19 25
31 67
67 93

Voglio sapere come funziona questa riga di comando su questo esempio per fornire l'output?

    
posta Pragyant Prada Behera 02.03.2017 - 13:33
fonte

1 risposta

1

Bene, parte imparare a usare Unix è capire quali sono gli script esistenti. In questo caso devi sapere un po 'di come awk funziona per capire il codice. Mi concentrerò sulla descrizione della parte awk , questo dovrebbe farti iniziare a capire il resto.

Fondamentalmente awk è un linguaggio di scripting basato su pattern, in cui i comandi consistono sia in un modello / condizione (di ricerca) che in un blocco di codice corrispondente. Durante l'esecuzione, qualsiasi file di input viene letto riga per riga e se il pattern / condizione è vero per una riga, viene eseguito il blocco di codice. Esistono modelli speciali BEGIN e END che vengono utilizzati per attivare il codice per ottenere prima la prima riga o dopo l'ultima riga viene letta.

Nel tuo esempio hai tre linee modello / codice:

NR==FNR {a[i++]=$0};

NR e FNR sono due variabili speciali impostate da awk . Puoi vedere il loro significato con man awk per vederlo

NR     ordinal number of the current record
FNR    ordinal number of the current record in the current file

quindi in pratica questa condizione è vera mentre le righe della prima riga vengono lette (il che significa che a[i++]=$0 viene eseguito una volta per ogni riga dal primo file) e false per tutti i file aggiuntivi. $0 è la riga di input corrente.

        {b[x++]=$0;};{k=x-i};

Questo blocco di codice non ha alcuna condizione / modello, quindi viene eseguito per ogni riga letta (da tutti i file incluso il primo).

END     {for(j=0;j<i;) print a[j++],b[k++]}' 

Questa parte viene eseguita dopo che l'ultima riga dell'ultimo file è stata letta ed elaborata.

Con queste basi dovresti essere in grado di capire da solo il significato dei diversi blocchi e variabili di codice.

    
risposta data 02.03.2017 - 20:14
fonte

Leggi altre domande sui tag