linux user group brescia

immagine del castello

Archivio della mailing list

[LugBS] domanda ignorante bash scripting

Rampage Rmp atomikramp a gmail.com
Ven 18 Maggio 2012 14:45:57 UTC
In realtà python sarebbe ottimo, ma quando mi sono messo a spulciare la
documentazione delle API, c'era da diventar matti, non so se è una mia
impressione, ma python è il linguaggio più bello del mondo, con la
documentazione peggiore del mondo :)

quindi siccome già avevo in mente qualche comando qua e là, e dovevo solo
mettere assieme i pezzi, ho optato per bash :)

alla fine ho optato per cut al posto di awk, che per fare quello che dovevo
fare andava più che bene :)

Francesco

2012/5/18 Carlo Bertoldi <mcbain a tiscali.it>

> Leggo in ritardo, però aggiungo lo stesso i miei due centesimi di dracma.
> A suo tempo avevo dovuto fare anche io elaborazioni su differenti file
> csv, e avevo optato per python.
> Nonostante non lo conoscessi, questo perché, non essendo un sysadmin,
> ogni volta che mi trovo a dover stendere uno script
> bash / awk mi accorgo che mi sono dimenticato il significato dei
> parametri e la sintassi più basilare.
> Python mi pare un po' più espressivo, e mi facilita molto trattare gli
> stessi argomenti a distanza di tempo.
>
> Magari sono io che sono troppo asino ;)
>
>  Carlo
>
> 2012/5/17 Rampage Rmp <atomikramp a gmail.com>:
> > ah ecco, dimenticavo..
> >
> > nel caso vi interessasse, l'ho risolta così
> >
> > #!/bin/bash
> >
> > FILENAME=$1
> >
> > for i in $(seq 1 69); do
> >
> >         COUNTER=$(cat "$FILENAME" | sed s/\"//g | cut -d ',' -f $i |
> grep -v
> > "^$" | wc -l)
> >
> >         if [ $COUNTER -ne 1 ]; then
> >                 COLONNETMP=${COLONNETMP}','$i
> >         fi
> >
> > done
> >
> > COLONNE=$(echo $COLONNETMP | sed 's/^.//')
> >
> > cat "$FILENAME" | sed s/\"//g | cut -d ',' -f $COLONNE
> >
> > ovviamente sapevo già a priori quante colonne avevo in totale :) ma la
> cosa
> > si può facilmente adattare dinamicamente.
> >
> > grazie per il supporto
> >
> > Francesco
> >
> > 2012/5/17 Rampage Rmp <atomikramp a gmail.com>
> >>
> >> credo di aver risolto
> >>
> >> Francesco
> >>
> >>
> >> 2012/5/17 Rampage Rmp <atomikramp a gmail.com>
> >>>
> >>> Grazie Gelma, in realtà è quasi tutto fatto, mi manca solo un passaggio
> >>> logico che la mia mente sciocca non riesce a risolvere, ma che
> sicuramente è
> >>> una banalità
> >>>
> >>> dato un array di interi, che può ovviamente variare in lunghezza oltre
> >>> che per valori, a fare l'equivalente di un
> >>>
> >>> cat filename | awk -F ';' '{print $1,$2,$3,$4}'
> >>>
> >>> dove 1 2 3 e 4 sono gli int dell'array?
> >>>
> >>> panico :D
> >>>
> >>> Francesco
> >>>
> >>> 2012/5/17 Andrea Gelmini <andrea.gelmini a linux.it>
> >>>>
> >>>> Il 17 maggio 2012 10:36, Rampage Rmp <atomikramp a gmail.com> ha
> scritto:
> >>>> > visto che il file non è un excel, e che la cosa sarà ripetuta per
> >>>> > molti file
> >>>> > analoghi, ho optato per fare uno scriptino in bash (eventualmente
> >>>> > valuterò
> >>>> > python se la cosa non si reisce a fare in maniera agile) piuttosto
> che
> >>>> > usare
> >>>> > libreoffice calc.
> >>>>
> >>>> In bash puro ti complichi un po' la vita. Puoi risolverlo dritto da
> >>>> AWK (che gia' ti offre tutto il necessario).
> >>>> In Python dovrebbe essere ancora piu' agile (perché ha un modulo
> >>>> dedicato).
> >>>> Non lo ho provato, ma io scriverei una cosa di questo tipo:
> >>>>
> >>>> -----------------------------------
> >>>> #!/usr/bin/python3
> >>>>
> >>>> import csv
> >>>>
> >>>> nuovocsv = csv.writer(open('/tmp/nuovo_file.csv', 'w', newline=''),
> >>>> delimiter=';', quoting=csv.QUOTE_ALL)
> >>>>
> >>>> with open('file_origine.csv', 'r') as fd:
> >>>>        reader = csv.reader(fd, delimiter=';', quoting=csv.QUOTE_ALL)
> >>>>        for riga in reader:
> >>>>                nuovi_campi=[campo for campo in riga if campo is not
> >>>> None]
> >>>>                nuovocsv.writerow(nuovi_campi)
> >>>> ------------------------------------
> >>>>
> >>>> > il problema è.. non ho trovato una guida decente per gestire gli
> array
> >>>> > o le
> >>>> > liste in bash.. qualcuno mi illumina su come fare? :D
> >>>>
> >>>> E' nella documentazione ufficiale. Guarda bene. E' lo stesso
> >>>> meccanismo per il quale passi gli argomenti agli script o alle
> >>>> funzioni.
> >>>> n.b.: ma scusa, una banale regexp che faccia il match di una sequenza
> >>>> tipo ,"", e la collassi con una virgola e basta?
> >>>>
> >>>> Ciao,
> >>>> Gelma
> >>>>
> >>>> --
> >>>> Info/Lamentele/Segnalazioni: andrea.gelmini a gmail.com
> >>>
> >>>
> >>
> >
> >
> > --
> > Info/Lamentele/Segnalazioni: andrea.gelmini a gmail.com
>
>
>
> --
> È molto più bello sapere qualcosa di tutto, che sapere tutto di una cosa.
>
> Blaise Pascal
>
> --
> Info/Lamentele/Segnalazioni: andrea.gelmini a gmail.com
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lugbs.linux.it/pipermail/lug/attachments/20120518/32993063/attachment.html>


Maggiori informazioni sulla lista Lug