Ho un paio di grandi file di testo e nel file UNIQS.txt
Ho un elenco di stringhe da grep
da un altro file. Il codice che uso è
grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam
che non fa nulla – il file generato è vuoto. Ma quando lo faccio
grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam
funziona correttamente. Questo mi confonde perché non pensavo a grep
interpreterebbe le voci in UNIQS.txt
come pattern regexp senza virgolette e barre e così via nel file (che non ci sono). In generale, se stai ricevendo i pattern da un file, penserà automaticamente che siano pattern regexp?
Modifica: Nel UNIQS.txt
file, ci sono stringhe separate da una nuova riga del modulo
HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783
(chiamati nomi di modelli) e il file EEP_VSL...
colonne separate da tabulazioni, con circa 14 colonne e la prima colonna è il nome del modello, quindi in pratica voglio estrarre la riga corrispondente a ciascun modello nel file.
Risposta accettata:
Il -f
opzione specifica un file in cui grep legge i modelli. È proprio come passare i modelli sulla riga di comando (con il -e
opzione se ce n'è più di uno), tranne per il fatto che quando chiami da una shell potrebbe essere necessario citare il modello per proteggere i caratteri speciali in esso contenuti dall'espansione della shell.
L'argomento -E
o -F
o -P
, se presente, dice a grep in quale sintassi sono scritti i pattern. Senza argomenti, grep si aspetta espressioni regolari di base; con -E
, grep si aspetta espressioni regolari estese; con -P
(se supportato), grep si aspetta espressioni regolari Perl; e con -F
, grep si aspetta stringhe letterali. Non importa se i pattern provengono dalla riga di comando o da un file.
Nota che le stringhe sono sottostringhe:se passi a+b
come modello quindi una riga contenente a+b+c
è abbinato. Se vuoi cercare righe contenenti esattamente una delle stringhe fornite e non più, passa il -x
opzione.