GNU/Linux >> Linux Esercitazione >  >> Linux

Linee comuni tra due file?

Questa domanda ha già risposte qui :Output delle linee comuni (somiglianze) di due file di testo (l'opposto di diff)?

(5 risposte)
Chiuso 3 anni fa.

Ho il seguente codice che eseguo sul mio terminale.

LC_ALL=C && grep -F -f  genename2.txt hg38.hgnc.bed > hg38.hgnc.goi.bed

Questo non mi dà le linee comuni tra i due file. Cosa mi sto perdendo?

Risposta accettata:

Usa comm -12 file1 file2 per ottenere righe comuni in entrambi i file.

Potresti anche aver bisogno che il tuo file sia ordinato in comm per funzionare come previsto.

comm -12 <(sort file1) <(sort file2)

Da man comm :

-1     suppress column 1 (lines unique to FILE1)
-2     suppress column 2 (lines unique to FILE2)

O usando grep comando devi aggiungere -x opzione per abbinare l'intera linea come modello di corrispondenza. Il F l'opzione sta dicendo a grep quel modello di corrispondenza come una stringa non una corrispondenza regolare.

grep -Fxf file1 file2

O usando awk .

awk 'NR==FNR{seen[$0]=1; next} seen[$0]' file1 file2

Questa è la lettura dell'intera riga di file1 in un array chiamato seen con la chiave tutta la riga (in awk il $0 rappresentano l'intera riga corrente).

Abbiamo usato NR==FNR come condizione per eseguire il blocco seguito solo per il primo input fle1 non file2 , perché NR in awk fare riferimento al numero della riga di elaborazione corrente e a FNR si riferisce al numero di riga corrente in tutti ingressi. quindi NR è unico per ogni file di input tranne FNR è unico per tutti gli input.

Il next c'è dire a awk non continuare il codice di riposo e ricominciare fino a NR non è uguale a FNR ciò significa tutte le righe di file1 letto da awk .

Quindi il prossimo seen[$0] verrà eseguito solo per il secondo file2 e per ogni riga in file2 esaminerà l'array e stamperà quella riga dove esiste nell'array.

Un'altra semplice opzione è usare sort e uniq :

sort file1 file2|uniq -d

Questo stamperà entrambi i file ordinati quindi uniq -d stamperà solo righe duplicate. MA questo è concesso quando NON ci sono righe duplicate in entrambi i file stessi, altrimenti sotto è sempre concesso anche se c'è una riga duplicata all'interno di entrambi i file.

uniq -d <(sort <(sort -u file1) <(sort -u file2))

Linux
  1. Stampa linee tra (ed escludendo) due motivi?

  2. Stampa linee tra (e inclusi) due motivi?

  3. Stampa due file in due colonne?

  4. Confronta due colonne di file diversi e stampa se corrisponde?

  5. Linux:come eliminare i file creati tra due volte?

Come trasferire file tra due computer utilizzando i comandi nc e pv

Come confrontare due file nel terminale Linux

Come sincronizzare automaticamente i file tra due server Linux

Differenza negli spazi bianchi tra due file su Linux

Come eliminare i file creati tra due volte?

Come copiare rapidamente un gran numero di file tra due server