Esiste uno strumento in grado di ottenere le righe che contiene il file A, ma il file B no? Potrei creare un piccolo script semplice con, ad esempio, perl, ma se qualcosa del genere esiste già, risparmierò tempo d'ora in poi.
Risposta accettata:
Sì. Lo standard grep
strumento per la ricerca di file per stringhe di testo può essere utilizzato per sottrarre tutte le righe in un file da un altro.
grep -F -x -v -f fileB fileA
Funziona utilizzando ogni riga in fileB come modello (-f fileB
) e trattandolo come una semplice stringa da abbinare (non una regolare regex) (-F
). Forza la corrispondenza su tutta la riga (-x
) e stampa solo le righe che non corrispondono (-v
). Quindi stai stampando le righe nel fileA che non contengono gli stessi dati di qualsiasi riga nel fileB.
Lo svantaggio di questa soluzione è che non tiene conto dell'ordine delle righe e se il tuo input ha righe duplicate in luoghi diversi potresti non ottenere ciò che ti aspetti. La soluzione è utilizzare un vero strumento di confronto come diff
. Puoi farlo creando un file diff con il valore di contesto al 100% delle righe nel file, quindi analizzandolo solo per le righe che verrebbero rimosse se si converte il file A nel file B. (Nota anche questo comando rimuove la formattazione delle differenze dopo aver ottenuto le righe giuste.)
diff -U $(wc -l < fileA) fileA fileB | sed -n 's/^-//p' > fileC