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