linux user group brescia

immagine del castello

Archivio della mailing list

[LugBS] domanda ignorante bash scripting

Carlo Bertoldi mcbain a tiscali.it
Ven 18 Maggio 2012 10:02:28 UTC
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



Maggiori informazioni sulla lista Lug