Pagina 1 di 2

[RISOLTO]Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 16:51
da cloudany
Ciao, allora spiego subito il task da eseguire:
Ho una serie di file in formato .ped dove all'interno di solo delle colonne e righe da leggere, la terza e quarta colonna sono interessanti per me in quanto contengono un'informazione dove se una delle due è diversa da 0 allora scrivo tale riga in un apposito file txt, il codice da me usate è questo:

Codice: Seleziona tutto

for FILE in *ped; cat *ped | cut -c1-200 | awk '$3 !=0 || $4!=0 [ print $1 $2]' > lista_figli-IDs_totali.txt
ma restituisce questo errore:

Codice: Seleziona tutto

bash: syntax error near unexpected token `cat'
Cosa sto sbagliando?

Re: Aiuto in bash

Inviato: giovedì 19 giugno 2014, 17:02
da Zoff
Forse intendi:

Codice: Seleziona tutto

for FILE in $(ls *ped); do cat *ped | cut -c1-200 | awk '$3 !=0 || $4!=0 [ print $1 $2]' > lista_figli-IDs_totali.txt; done

Re: Aiuto in bash

Inviato: giovedì 19 giugno 2014, 17:03
da vaeVictis
Come primo passo, dopo aver dato un titolo appropriato alla discussione, controlla la sintassi del ciclo for in bash, perché il primo errore è lì.

@Zoff
Manca(va) il do dopo il ;
Non usando FILE ma *ped nel cat presumo che dia errore, o comunque si comporti in modo "strano".

Re: Aiuto in bash

Inviato: giovedì 19 giugno 2014, 17:05
da Zoff
uhm... no

Re: Aiuto in bash

Inviato: giovedì 19 giugno 2014, 17:09
da vaeVictis
Nella prima visualizzazione del tuo messaggio mancava, poi è comparso (infatti ho modificato il tempo del verbo).
Però c'è il problema dell'uso della wildcard * nell'argomento passato a cat:

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~/Programmazione/Bash$ ls
totale 0
-rw-rw-r-- 1 vaevictis vaevictis 0 giu 19 17:07 bar.txt
-rw-rw-r-- 1 vaevictis vaevictis 0 giu 19 17:07 foo.txt
-rw-rw-r-- 1 vaevictis vaevictis 0 giu 19 17:07 foobar.txt
vaevictis@vaevictis-HAL:~/Programmazione/Bash$ for FILE in `\ls *txt`; do file *txt; done
bar.txt:    empty 
foobar.txt: empty 
foo.txt:    empty 
bar.txt:    empty 
foobar.txt: empty 
foo.txt:    empty 
bar.txt:    empty 
foobar.txt: empty 
foo.txt:    empty 

p.s.:
Onde evitare di fare confusione, forse è meglio che l'utente venga aiutato da una sola persona.
Aspetto istruzioni su come regolarmi.
Ciao.

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 17:16
da cloudany
Il cat *ped non mi convince rimane bloccato su un qualcosa di infinito e non va avanti, avete idee su qualche alternativa?

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 17:22
da vaeVictis
cloudany [url=http://forum.ubuntu-it.org/viewtopic.php?p=4602447#p4602447][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Il cat *ped non mi convince rimane bloccato su un qualcosa di infinito e non va avanti, avete idee su qualche alternativa?
Non è che non ti convinca.
È proprio una toppa :)
Il motivo è che per ogni FILE che ha trovato con il comando ls, applica cat a TUTTI i file che hanno come estensione ped e sono contenuti in quella cartella.
Quindi se hai 10 file con ped come estensione, farai 10*10 volte cat :)


Ora, tu *chiaramente* cosa è che devi fare?
A prescindere, comunque, se devi poi fare operazioni sul file e quindi ti serve il path è preferibile (secondo la scuola di pensiero che ho sposato :D ) usare il comando find.

Spiegheresti meglio cosa devi ottenere?

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 17:27
da cloudany
Ti spiego all'interno di questi ped file ci sono diverse colonne la terza e la quarta mi dicono se il soggetto ha la mamma ed il papà, con valori binari, se questi valori sono diversi da 0 , prenso l'id del bimbo e lo salvo in un file txt questo per tutti i ped

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 17:30
da vaeVictis
Ok, il problema più o meno l'ho capito.
Scusami se ti faccio altre domande, ma in questo modo risolviamo prima :)

Il comando lo inserisci in uno script?
O lo dai da riga di comando?

A cosa ti serve il

Codice: Seleziona tutto

cut -c1-200
invece?

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 17:34
da cloudany
Vado di riga di comando, essendoci un centinaio di migliaio di colonne con il cut le riduco a 200

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 17:57
da vaeVictis
Credo si possa ridurre di molto il comando.
Nel senso che:
1) il ciclo for in realtà non serve, perché puoi passare direttamente la "lista" di file da elaborare al comando awk, usando la wildcard nel modo appropriato
2) non ti serve ridurre i campi, tanto comunque sempre i primi 4 controlli

Inoltre, la sintassi del comando awk (a meno che a me non sfugga qualcosa) non è corretta.

Partiamo un attimo da questo ultimo aspetto... la sintassi di awk.
Quella corretta dovrebbe essere questa:

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~$ echo "foo bar 1 0" | awk '{if($3 != 0 || $4 != 0) print $1" "$2}'
foo bar
Questo intanto ti torna?

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 18:00
da vaeVictis
Ah, se la sintassi di awk ti sembra corretta, il comando che puoi dare per fare quello che ti serve è questo:

Codice: Seleziona tutto

awk '{if($3 != 0 || $4 != 0) print $1" "$2}' *ped >> file_di_output

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 18:02
da cloudany
awk: program limit exceeded: maximum number of fields size=32767

Ecco il perchè del cut xD

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 18:04
da vaeVictis
cloudany [url=http://forum.ubuntu-it.org/viewtopic.php?p=4602492#p4602492][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:awk: program limit exceeded: maximum number of fields size=32767

Ecco il perchè del cut xD
E LA MADO'! :D

Comunque, la sintassi del singolo comando awk ti sembra corretta?
Nel senso, ti funziona se gli passi una riga di un file nella echo?

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 18:05
da cloudany
Si si corretto , manca solo il cut ora

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 18:12
da vaeVictis
Ok, allora diciamo che praticamente è risolto... ma c'è un ma.
Facendo così leggi i file più volte inutilmente.

Potresti postarmi la prima parte di una stringa che prendi da questi file?
Secondo me forse non è la strategia migliore usare tutti questi taglia e cuci

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 18:40
da vaeVictis
p.s.:
Se comunque l'aspetto delle performance non ti interessa, dovresti risolvere con il comando:

Codice: Seleziona tutto

for FILE in *.ped; do cut -c1-200 "$FILE" | awk ... ; done
in cui nei puntini sostituisci quanto già visto.

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 18:45
da cloudany
Ottimo così, l'unico problema ora è che mettendo

Codice: Seleziona tutto

for FILE in *.ped; do cut -c1-200 "$FILE" | awk '{if($3 != 0 || $4 != 0) print $1" "$2}' *ped >> file_di_output
mi da il terminale

>
e non si muove...

ps gentilissimo grazie davvero

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 18:51
da vaeVictis

Codice: Seleziona tutto

for FILE in *.ped; do cut -c1-200 "$FILE" | awk '{if($3 != 0 || $4 != 0) print $1" "$2}'; done >> file_di_output
Al posto di file_di_output devi mettere il percorso in cui vuoi salvare l'output.

Re: Aiuto sintassi in bash

Inviato: giovedì 19 giugno 2014, 18:54
da cloudany
L'ho fatto ma nulla