Lettura di schemi grep da un file


49

Ho un paio di grandi file di testo e nel file UNIQS.txtho un elenco di stringhe grepda 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 grepche interpretasse le voci UNIQS.txtcome schemi regexp senza virgolette e barre e così via nel file (che non ci sono). In generale, è possibile che se si ottengono i pattern da un file, si penserà automaticamente che sono pattern regexp?

Modifica: nel UNIQS.txtfile sono presenti stringhe separate di nuova riga del modulo

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(chiamati nomi dei modelli) e le EEP_VSL...colonne separate dalla scheda del file , con circa 14 colonne e la prima colonna è il nome del modello, quindi sostanzialmente desidero estrarre la linea corrispondente a ciascun modello nel file.

Risposte:


60

L' -fopzione specifica un file in cui grep legge i pattern. È proprio come passare dei pattern sulla riga di comando (con l' -eopzione se ce n'è più di uno), tranne per il fatto che quando si chiama da una shell potrebbe essere necessario citare il modello per proteggere i caratteri speciali in esso contenuti dall'espansione della shell.

L'argomento -Eo il -Fo -P, se del caso, dice che grep sintassi i modelli sono scritti in Senza argomenti, grep si aspetta. Espressioni regolari di base ; con -E, grep prevede espressioni regolari estese ; con -P(se supportato), grep si aspetta espressioni regolari Perl ; e con -Fgrep si aspetta stringhe letterali. Non importa se i motivi provengono dalla riga di comando o da un file.

Si noti che le stringhe sono sottostringhe: se si passa a+bcome modello, a+b+cviene abbinata una linea contenente . Se si desidera cercare righe contenenti esattamente una delle stringhe fornite e non più, passare l' -xopzione.


1
Va bene è utile grazie. Posso chiedere, suppongo che volessi abbinare esattamente la stringa, cioè se la stringa è 12345, allora voglio che corrisponda solo su 12345, non su 123456 o 123455 ecc., Come farei per fare questo?
sdf,

2
@sdf Leggi il mio ultimo paragrafo:-x
Gilles 'SO- smetti di essere malvagio' il

È così vecchio, mi dispiace di averlo scoperto. Mentre la spiegazione sopra è fantastica, è un po 'vaga sul motivo per cui i pattern (stringhe) del file non corrispondono senza il -Fflag. La mia ipotesi è che -nella riga di esempio sopra causa questo da leggere come una sequenza di caratteri? Non richiederebbe anche parentesi quadre? Ho provato con alcuni file di esempio ma non sono giunto a una conclusione.
TRS

@trs La riga mostrata nella domanda (che è stata aggiunta dopo aver pubblicato la mia risposta) non contiene alcun carattere che abbia un significato speciale in regexps, quindi si comporta allo stesso modo con e senza -F. Farebbe la differenza con personaggi come \[*^$.
Gilles 'SO- smetti di essere malvagio' il

@Gilles grazie, anche questa è stata la mia impressione ma il @sdf afferma "il file generato è vuoto" (leggi: nessuna corrispondenza) senza la -Fbandiera?
TRS

0

Ho avuto lo stesso errore, non risolto con la buona risposta di @gilles. Guardando più da vicino nel file di input, ho trovato 2 nuove righe alla fine. Senza questi, il successo è necessario solo: grep -i file_pattern_input file

(GNU grep 3.1, file di input più di 5000 record, file di corrispondenza / modello 2536, sapevo che tutti i 2536 dovevano essere nel file. Con le nuove righe ho tutte le righe del file e senza solo le 2536 righe corrispondenti)


1
Ciò non è correlato al problema di OP. Una riga vuota viene letta da grep come un modello vuoto e un modello vuoto corrisponde ovunque.
Muru
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.