(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))