[RISOLTO] Aiuto per script: estrazione campi con grep

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
EmaDaCuz
Linux 3.x
Linux 3.x
Messaggi: 877
Iscritto il: sab 28 gen 2006, 15:47
Slackware: 12.0 - ma a Trieste
Kernel: 2.6.25
Desktop: Fluxbox
Distribuzione: Debian e Arch
Località: Nijmegen, NL
Contatta:

[RISOLTO] Aiuto per script: estrazione campi con grep

Messaggio 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
Ultima modifica di EmaDaCuz il ven 22 feb 2008, 17:58, modificato 1 volta in totale.

sixjan
Linux 2.x
Linux 2.x
Messaggi: 413
Iscritto il: dom 6 gen 2008, 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: Aiuto per script: estrazione campi con grep

Messaggio 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

Avatar utente
FireEater
Linux 3.x
Linux 3.x
Messaggi: 508
Iscritto il: sab 5 feb 2005, 0:00
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4
Località: Cagliari <---> Torino

Re: Aiuto per script: estrazione campi con grep

Messaggio 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

Avatar utente
EmaDaCuz
Linux 3.x
Linux 3.x
Messaggi: 877
Iscritto il: sab 28 gen 2006, 15:47
Slackware: 12.0 - ma a Trieste
Kernel: 2.6.25
Desktop: Fluxbox
Distribuzione: Debian e Arch
Località: Nijmegen, NL
Contatta:

Re: Aiuto per script: estrazione campi con grep

Messaggio 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

sixjan
Linux 2.x
Linux 2.x
Messaggi: 413
Iscritto il: dom 6 gen 2008, 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: Aiuto per script: estrazione campi con grep

Messaggio da sixjan »

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

edit:

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

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: Aiuto per script: estrazione campi con grep

Messaggio 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.

Avatar utente
EmaDaCuz
Linux 3.x
Linux 3.x
Messaggi: 877
Iscritto il: sab 28 gen 2006, 15:47
Slackware: 12.0 - ma a Trieste
Kernel: 2.6.25
Desktop: Fluxbox
Distribuzione: Debian e Arch
Località: Nijmegen, NL
Contatta:

Re: Aiuto per script: estrazione campi con grep

Messaggio 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.

Rispondi