[RISOLTO]Aiuto sintassi in bash

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

[RISOLTO]Aiuto sintassi in bash

Messaggio 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?
Ultima modifica di cloudany il giovedì 19 giugno 2014, 19:31, modificato 2 volte in totale.
" 4 letters are enough to explain mankind"
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: Aiuto in bash

Messaggio 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
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Aiuto in bash

Messaggio 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".
Ultima modifica di vaeVictis il giovedì 19 giugno 2014, 17:06, modificato 1 volta in totale.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: Aiuto in bash

Messaggio da Zoff »

uhm... no
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Aiuto in bash

Messaggio 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.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Aiuto sintassi in bash

Messaggio da cloudany »

Il cat *ped non mi convince rimane bloccato su un qualcosa di infinito e non va avanti, avete idee su qualche alternativa?
" 4 letters are enough to explain mankind"
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Aiuto sintassi in bash

Messaggio 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?
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Aiuto sintassi in bash

Messaggio 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
" 4 letters are enough to explain mankind"
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Aiuto sintassi in bash

Messaggio 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?
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Aiuto sintassi in bash

Messaggio da cloudany »

Vado di riga di comando, essendoci un centinaio di migliaio di colonne con il cut le riduco a 200
" 4 letters are enough to explain mankind"
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Aiuto sintassi in bash

Messaggio 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?
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Aiuto sintassi in bash

Messaggio 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
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Aiuto sintassi in bash

Messaggio da cloudany »

awk: program limit exceeded: maximum number of fields size=32767

Ecco il perchè del cut xD
" 4 letters are enough to explain mankind"
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Aiuto sintassi in bash

Messaggio 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?
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Aiuto sintassi in bash

Messaggio da cloudany »

Si si corretto , manca solo il cut ora
" 4 letters are enough to explain mankind"
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Aiuto sintassi in bash

Messaggio 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
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Aiuto sintassi in bash

Messaggio 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.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Aiuto sintassi in bash

Messaggio 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
" 4 letters are enough to explain mankind"
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Aiuto sintassi in bash

Messaggio 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.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Aiuto sintassi in bash

Messaggio da cloudany »

L'ho fatto ma nulla
" 4 letters are enough to explain mankind"
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 7 ospiti