Repository 32bit  Forum
Repository 64bit  Wiki

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

[RISOLTO] Aiuto per script: estrazione campi con grep

Messaggioda EmaDaCuz » ven feb 22, 2008 16:42

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 feb 22, 2008 17:58, modificato 1 volta in totale.
Avatar utente
EmaDaCuz
Linux 2.6
Linux 2.6
 
Messaggi: 863
Iscritto il: sab gen 28, 2006 15:47
Località: Nijmegen, NL
Slackware: 12.0 - ma a Trieste
Kernel: 2.6.25
Desktop: Fluxbox
Distribuzione: Debian e Arch

Re: Aiuto per script: estrazione campi con grep

Messaggioda sixjan » ven feb 22, 2008 17:14

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
sixjan
Linux 2.4
Linux 2.4
 
Messaggi: 407
Iscritto il: dom gen 06, 2008 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: Aiuto per script: estrazione campi con grep

Messaggioda FireEater » ven feb 22, 2008 17:24

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
FireEater
Linux 2.6
Linux 2.6
 
Messaggi: 508
Iscritto il: sab feb 05, 2005 0:00
Località: Cagliari <---> Torino
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4

Re: Aiuto per script: estrazione campi con grep

Messaggioda EmaDaCuz » ven feb 22, 2008 17:42

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
Avatar utente
EmaDaCuz
Linux 2.6
Linux 2.6
 
Messaggi: 863
Iscritto il: sab gen 28, 2006 15:47
Località: Nijmegen, NL
Slackware: 12.0 - ma a Trieste
Kernel: 2.6.25
Desktop: Fluxbox
Distribuzione: Debian e Arch

Re: Aiuto per script: estrazione campi con grep

Messaggioda sixjan » ven feb 22, 2008 17:44

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

edit:

grep -w "N " il_file | grep -v "?"
sixjan
Linux 2.4
Linux 2.4
 
Messaggi: 407
Iscritto il: dom gen 06, 2008 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: Aiuto per script: estrazione campi con grep

Messaggioda 414N » ven feb 22, 2008 17:54

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
414N
Iper Master
Iper Master
 
Messaggi: 2882
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: Aiuto per script: estrazione campi con grep

Messaggioda EmaDaCuz » ven feb 22, 2008 17:58

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.
Avatar utente
EmaDaCuz
Linux 2.6
Linux 2.6
 
Messaggi: 863
Iscritto il: sab gen 28, 2006 15:47
Località: Nijmegen, NL
Slackware: 12.0 - ma a Trieste
Kernel: 2.6.25
Desktop: Fluxbox
Distribuzione: Debian e Arch


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti

cron