Sto cercando di confrontare due file (Extensions.txt e Temp.txt ). Se è presente una riga che non corrisponde parzialmente a Extensions.txt in Temp.txt Vorrei aggiungere la riga mancante a Temp.txt .
Extensions.txt (Molto semplice, una colonna):
111
1234
4321
Temp.txt :
1234/sip:[email protected]:5060 9421b96c5e Avail 1.480
4321/sip:[email protected]:5060 e9b6b979a4 Avail 1.855
Fondamentalmente, quello che voglio fare è trovare una corrispondenza basata su tutto prima del / nella prima colonna e se non c'è corrispondenza, vorrei stampare la riga non corrispondente in fondo al file in modo che finisca così:
1234/sip:[email protected]:5060 9421b96c5e Avail 1.480
4321/sip:[email protected]:5060 e9b6b979a4 Avail 1.855
111
Finora ho provato grep -v e non produce i risultati che voglio, ho anche provato con awk e sembra che sia la strada da percorrere, tuttavia non ho una piena comprensione di come awk lavora al fine di produrre i risultati appropriati.
Risposta accettata:
Puoi analizzare i file con awk
awk -F '/' '
FNR == NR {seen[$1] = $0; next}
{if ($1 in seen) print seen[$1]; else missing[$1]}
END {for (x in missing) print x}
' Temp.txt Extensions.txt
Uscita:
1234/sip:[email protected]:5060 9421b96c5e Avail 1.480
4321/sip:[email protected]:5060 e9b6b979a4 Avail 1.855
111
- Imposta il separatore di campo su una barra,
-F '/' - L'azione dopo
FNR == NRviene eseguito per le righe del primo file di input. Memorizziamo le righe nell'array associativoseencome chiavi e vai sunextlinea. - La seconda azione viene eseguita per il secondo file, quando
FNR != NR. Se il primo campo corrisponde, stampiamo la riga memorizzata,elsesalviamo il campo in un altro arraymissing. - Al
END, stampiamo le righe mancanti.