2011-10-21 17 views

risposta

22

prova:

awk 'FNR==NR{a[NR]=$3;next}{$2=a[FNR]}1' f2 f1 

uscita:

111 000 444 
222 111 555 
333 555 666 

Spiegazione del codice di cui sopra:

  • FNR==NR tutto ti porta a lavorare con un intero file alla volta. In questo caso è il file f2. NR e FNR entrambi contengono numeri di riga con la differenza FNR viene reimpostato su 1 quando viene letto un nuovo file dove NR continua ad aumentare.
  • Mentre stiamo lavorando con f2 file, creando un array chiamato a utilizzando numero della riga (NR) come colonna key e terzo ($3) come valore. next ci consente di saltare il resto del blocco azione.
  • Una volta terminato il file f2, iniziamo a lavorare sul file f1. NR==FNR condizione non diventa falso come FNR aumenterà da 1 e NR no. Quindi verrà elaborato solo il secondo blocco di azioni {$2=a[FNR]}.
  • Che cosa fa questo blocco riassegna il secondo valore di colonna al valore di matrice cercando il numero di riga.
  • 1 alla fine stampa la linea. Restituisce true e nelle affermazioni true awk risulta la stampa della linea.
  • f2 f1 è l'ordine dei file definiti. Dal momento che vogliamo creare un array dal file f2, lo inseriamo per primo.
+1

Potrebbe spiegare il comando. Grazie – saloua

+0

@saloua ho aggiunto qualche spiegazione. Spero possa aiutare! –

+1

Il mio caso d'uso è leggermente diverso (solo leggermente). La differenza è che avevo un file delimitato da virgola per f1 e f2 invece di delimitato da spazi. Ho provato il tuo stesso comando con l'opzione '-F,' ma il file di output non aveva la virgola in quel caso. Qualche modo per risolvere questo problema? – Ganesh

Problemi correlati