2012-05-31 12 views
8

Sto utilizzando la funzione grep -f per estrarre le righe da un file che corrisponde a un modello particolare. Diciamo che il mio file di pattern è pattern.txt, come segue.Informazioni su 'grep -f': modello di corrispondenza con file

1 
2 
3 
4 
5 

e il file contro la quale sto matching questo modello è file.txt,

1::anv 
2::tyr 
3::yui 
4::fng 
5::gdg 
6::ere 
7::rer 
8::3rr 
9::gty 

Ora, quando faccio un grep -f pattern.txt file.txt, sto ottenendo questo ->

1::anv 
2::tyr 
3::yui 
4::fng 
5::gdg 
8::3rr 

L'ultima riga nell'output sopra, sta causando il mio problema. Come posso modificare questo comando grep in modo da ottenere l'output (mostrando corrispondenze corrette) come segue?

1::anv 
2::tyr 
3::yui 
4::fng 
5::gdg 
+0

Ho provato grep "' more patt.txt' "file.txt | awk -F '::' '{print $ 1 "" $ 2}' Ma anche questo mi dà lo stesso problema. – ana

risposta

12

Aggiungi ^ prima che i modelli in modo che grep corrisponderà iniziare una linea con il modello. Se il tuo modello è in realtà un insieme di numeri, non hai bisogno di un elenco di modelli. Basta usare ^[1-5]:.

+0

Grazie. l'ha fatto – ana

+4

tieni presente che^1 corrisponderà a 10 :, ecc. Se i numeri diventeranno mai così grandi. –

6

Bene, ci sono molte possibili soluzioni. Stai dicendo a grep di trovare tutte le righe che contengono un 3, e la riga '8 :: 3rr' contiene infatti un 3. quindi devi essere più specifico in ciò che stai cercando.

Ad esempio, è possibile modificare i modelli su "1:", "2:", ecc. Per far corrispondere solo i numeri seguiti dai due punti. Oppure puoi cambiarli in '^ 1', '^ 2', ecc. Per abbinare solo i numeri all'inizio della riga. Dipende dai tuoi dati, ma probabilmente vuoi entrambi, in modo che la ricerca di '1:' non corrisponda a '21: 'e la ricerca di'^5 'non corrisponda a '53:'. Nel qual caso il tuo file di pattern vorrebbe questo:

^1: 
^2: 
^3: 
^4: 
^5: