Pagina 1 di 1

[RISOLTO] Aiuto per script: estrazione campi con grep

Inviato: ven 22 feb 2008, 16:42
da EmaDaCuz
Mi avvicino piano piano alla programmazione e i miei requisiti sono veramente prossimi allo zero, quindi scusatemi se utilizzero' termini a casaccio.
Il mio problema.
Devo estrarre da un file di testo solo delle righe contenenti solo determinati caratteri. Per ora ho usato grep' e funziona. Nel caso particolare

Codice: Seleziona tutto

grep "HN" 18-02 > HN.txt
Il problema nasce quando mi trovo in un'altra situazione. Mi servirebbe estrarre delle righe che contnegono campi fatti in questa maniera

Codice: Seleziona tutto

N      1
N      2
cioe' N seguito da 6 spazi ed una cifra. Finora ho fatto a mano

Codice: Seleziona tutto

grep "N      1" 18-02 > N1.txt
grep "N      2" 18-02 > N2.txt
e poi ho unito tutti i file con

Codice: Seleziona tutto

cat N1.txt N2.txt > N.txt
So che non e' il massimo ma almeno funziona. Solo che volevo in quante modo automatizzare la procedura con un ciclo (non so quale).
La situazione ad un certo punto pero' si complica perche', quando le cifre diventano due, gli spazi tra N e il numero diventano cinque e non piu' sei. Ad esempio ho "N 10" -----> N -cinque spazi- 10. Il numero che segue N puo' arrivare fino a 99.
Stessi problemi quando N invece non e' seguito da nessun altro numero. Se do "grep N" mi torna, ovviamente, tutte le righe che contengono almeno una N, tra cui anche le HN dell'esempio precedente.
Come faccio?

Se riuscite a darmi qualche dritta, magari commentata cosi' forse riesco ad imparare dai miei errori.

Grazie mille.

PS: qualsiasi linguaggio mi va bene, anche se preferirei uno shell script :D

Re: Aiuto per script: estrazione campi con grep

Inviato: ven 22 feb 2008, 17:14
da sixjan
Ciao. Intanto per avere solo le N solitarie seguite da spazio, puoi provare

grep -w "N "

se poi le righe cominciano con "N " è ancora più semplice:

grep -w "^N "

saluti

Re: Aiuto per script: estrazione campi con grep

Inviato: ven 22 feb 2008, 17:24
da FireEater
Ci sono almeno un milione di soluzioni, per il tuo caso ne posto una a caso(bacata, ma non ho voluto usare l'OR):

grep -E '^N {5,6}[0-9]{1,2}$' file

^ indica inizio riga

$ indica la fine della riga(in questo caso non è necessario perchè ho già contato gli spazi )

{5,6} è preceduto da uno spazio indica che ci devono essere tra 5 e 6 spazi prima della cifra. In pratica {n,m} dove uno dei due si può anche omettere

[0-9] indica un insieme di valori, ad esempio [a-zA-Z0-9]

[^0-9] esclude i numeri da 0-9

| indica l'operatore logico OR


Ah.. ogni [....] indica vale per un solo carattere se non seguito da "+"(ripetuto 1 o più volte) o "*" ripetuto da 0 a più volte.

Bene, io ho scritto poco, le espressioni regolari possono diventare anche molto complicate quindi scaricati qualche guida. O magari qualche esercitazione di qualche facoltà di informatica.

Ciao

PS: l'exp è bacata perchè accetta anche righe tipo N (6 spazi) xx

Re: Aiuto per script: estrazione campi con grep

Inviato: ven 22 feb 2008, 17:42
da EmaDaCuz
OK, ci sono quasi.
Praticamente il comando

grep -w "N "

mi andrebbe bene ma mi trova anche delle righe che contengono

N?1

A questo punto chiedo se e' possibile eliminarle :D
Suppongo di si, e mi ricordo che c'era anche un topic a riguardo.
Grazie per l'aiuto

Re: Aiuto per script: estrazione campi con grep

Inviato: ven 22 feb 2008, 17:44
da sixjan
grep -w "N " | grep -v "?"

edit:

grep -w "N " il_file | grep -v "?"

Re: Aiuto per script: estrazione campi con grep

Inviato: ven 22 feb 2008, 17:54
da 414N
Beh, se le righe che ti interessano iniziano per N, qualunque sia il numero di spazi ti basta:

Codice: Seleziona tutto

grep '^N' file | awk '{ print $1,$2}'
Con questo file di prova:

Codice: Seleziona tutto

N    2
N               12
N      1234124
n 23918
produce questo output:

Codice: Seleziona tutto

N 2
N 12
N 1234124
awk è uno strumento molto potente e versatile per filtrare il contenuto delle stringhe.

Re: Aiuto per script: estrazione campi con grep

Inviato: ven 22 feb 2008, 17:58
da EmaDaCuz
Grazie a tutti.

Risolto col metodo sixjan, ma ringrzio anche fire_eater.

Mi sa che e' meglio che inizi a studiare un po' meglio... ma adesso sono troppo indaffarato.