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:
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
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

) 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
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
E LA MADO'!
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