[Risolto]Script-contatore nel ciclo

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
NicoCale
Prode Principiante
Messaggi: 16
Iscrizione: domenica 18 maggio 2014, 11:12
Desktop: ubuntu
Distribuzione: Ubuntu14.04 x86_64

[Risolto]Script-contatore nel ciclo

Messaggio da NicoCale »

Ciao a tutti, premetto di essere un novizio del mondo linux e quindi della programmazione su esso.
Mi è stato assegnato il compito di creare uno script che legga un primo file di testo(contenente tutti gli alunni della mia stessa scuola) e che salvi in un secondo file di testo alcuni dati quali Numerazione@Clesse-sezione@Cognome@Nome@Codice fiscale, ma sono degli alunni che seguono il corso di informatica e siano del triennio.
Arrivato a questo punto però ho incontrato un problema, il contatore non si incrementa anche se la sintassi è corretta o almeno lo apparentemente... Soluzioni?(incremento riga 25) (output contatore riga 16)
Inoltre il mio professore sostiene che lo script è troppo lungo... non saprei come fare.
Grazie mille in anticipo per l'aiuto.


Qui sotto vi è riportato lo script da me realizzato e sotto di esso un piccolo esempio del documento.

Codice: Seleziona tutto

 #! /bin/bash

  i=1001
  classe=""

  echo "Elaborazione in corso..."
  cat elenco.csv | grep INFORMATICA | (
         while read riga 
                  do 
                   classe=`echo $riga | cut -d"," -f6 | cut -c -1`
                   if [ ${classe} = "3" ] || [ ${classe} = "4" ] || [ ${classe} = "5" ]

                      then
        
                       (
                        echo -n "$i@"
                        rig=$(echo $riga | cut -d"," -f6 | cut -c -2)
                       echo -n "$rig@"
                       rig=$(echo $riga | cut -d"," -f3)
                       echo -n "$rig@"
                       rig=$(echo $riga | cut -d"," -f4)
                      echo -n "$rig@"
                       rig=$(echo $riga | cut -d"," -f5)
                      echo $rig 
                       i=$(($i+1))
                        ) >> lista.txt 
                 fi
            done
 echo "Elaborazione terminata! "
   )

es documento:
0000556,Rossi Luca,Rossi,Luca,(CODICE FISCALE),3IModa,3I INFORMATICA
0000342,Neri Giovanni,Neri,Giovanni,(CODICE FISCALE),2FLuce,2F INFORMATICA
0002506,Rambaldi Mario,Rambaldi,Mario,(CODICE FISCALE),5MRovi,5H MECCANICA
Ultima modifica di NicoCale il lunedì 19 maggio 2014, 23:57, modificato 2 volte in totale.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Script-contatore nel ciclo

Messaggio da UbuNuovo »

Perché metti l'echo di $1 prima che sia incrementato! (se vuoi che sia sempre incrementato all'inizio)
Ricordati che stai lavorando in una subshell.
O fai l'incremento prima o meglio... (immagino che tu non possa usare awk) invece di fare tutti quegli echo assegni i vari campi estratti a variabili con un nome significativo e da ultimo costrusci la stringa come vuoi e la mandi in stampa con un unico echo, così lo script diventa più comprensibile e anche più flessibile nel caso dovessi cambiare l'ordine dei record nella stringa.
La forma

Codice: Seleziona tutto

 a=`espressione`
è deprecata meglio usare

Codice: Seleziona tutto

a=$(espressione)
.
Poi ti consiglio di abituarti ad indentare il codice.
Nel forum c'è il tag apposito per il codice (in alto pulsante codice) usalo e non c'è bisogno di mettere i numeri di riga.

Ora sto vedendo il mondiale moto, comunque l'ho provato! Se elimini le subshell e fai la stringa come detto sopra funge.
funzionerebbe anche mantenendo le subshell mettendo la parte di incremento fuori dalle parentesi:

Codice: Seleziona tutto

...
echo $rig
 ) >> lista.txt
 i=$(($i+1))
fi
done
echo "Elaborazione terminata! "
)
Ma è meglio se eviti le subshell!
Salva l'Ucraina! 🇺🇦
NicoCale
Prode Principiante
Messaggi: 16
Iscrizione: domenica 18 maggio 2014, 11:12
Desktop: ubuntu
Distribuzione: Ubuntu14.04 x86_64

Script-contatore nel ciclo

Messaggio da NicoCale »

Grazie a te finalmente ci sono venuto a capo !
Grazie mille UbuNuovo :)
Avatar utente
jackynet92
Moderatore Globale
Moderatore Globale
Messaggi: 13413
Iscrizione: sabato 3 settembre 2011, 1:41
Desktop: Mate
Distribuzione: Ubuntu 16.04 64bit
Sesso: Maschile
Località: Torino

Re: Script-contatore nel ciclo

Messaggio da jackynet92 »

Se ritieni risolto il problema, modifica il titolo del primo post aggiungendo all'inizio [Risolto].

Se vuoi puoi installare questo script che ti aggiunge un pulsante che ti permette di mettere [Risolto] con un solo click.

Alla prossima :ciao:
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Script-contatore nel ciclo

Messaggio da UbuNuovo »

Visto che hai già fatto pubblico le modifiche che avrei fatto io:

Con il file elenco:

Codice: Seleziona tutto

8-) cat elenco.csv 
0000556,Rossi Luca,Rossi,Luca,(CODICE FISCALE),3IModa,3I INFORMATICA
0000342,Neri Giovanni,Neri,Giovanni,(CODICE FISCALE),2FLuce,2F INFORMATICA
0002506,Rambaldi Mario,Rambaldi,Mario,(CODICE FISCALE),5MRovi,5H MECCANICA
0004646,Rossi Valentino,Rossi,Valentino,(CODICE FISCALE),4IMoto,4I INFORMATICA
e lo script:

Codice: Seleziona tutto

#!/bin/bash

# creare uno script che legga un file di testo contenente gli alunni
# e che salvi in un secondo file di testo i dati: 
# Numerazione@Classe-sezione@Cognome@Nome@Codice fiscale, 
# ma solo degli alunni di informatica anno 3, 4 e 5
# es:riga input:
# 0004646,Rossi Valentino,Rossi,Valentino,(CODICE FISCALE),4IMoto,4I INFORMATICA

i=1001

echo "Elaborazione in corso..."
cat elenco.csv | grep INFORMATICA | 
while read riga
do
	classe=$(echo $riga | cut -d"," -f6 | cut -c -1)
	if [ "$classe" = "3" ] || [ "$classe" = "4" ] || [ "$classe" = "5" ]

	then
		class_sez=$(echo $riga | cut -d"," -f6 | cut -c -2)
		cognome=$(echo $riga | cut -d"," -f3)
		nome=$(echo $riga | cut -d"," -f4)
		cod_fisc=$(echo $riga | cut -d"," -f5)
		
		 echo "$i@$class_sez@$cognome@$nome$cod_fisc" >> lista.txt
		 i=$(($i+1))
	fi
done
echo "Elaborazione terminata! "
ottengo:

Codice: Seleziona tutto

8-) cat lista.txt
1001@3I@Rossi@Luca(CODICE FISCALE)
1002@4I@Rossi@Valentino(CODICE FISCALE)
Con awk sarebbe bastato questo:

Codice: Seleziona tutto

awk -F, -v i=1000 '/INFORMATICA/ { class=substr($6, 0 , 1); if(class > 2) {class_sez=substr($6, 0 , 2); i=i+1; print i"@"class_sez"@"$3"@"$4"@"$5;}; }' elenco.csv > lista.txt
Salva l'Ucraina! 🇺🇦
NicoCale
Prode Principiante
Messaggi: 16
Iscrizione: domenica 18 maggio 2014, 11:12
Desktop: ubuntu
Distribuzione: Ubuntu14.04 x86_64

Re: [Risolto]Script-contatore nel ciclo

Messaggio da NicoCale »

Essendo alle prime armi ci sono comandi che non ho ancora visto, come per esempio "awk" e "print"
grazie per avermeli resi noti, possono tornarmi molto utili.
Grazie mille di nuovo!
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Risolto]Script-contatore nel ciclo

Messaggio da vaeVictis »

@NicoCale
Quando si posta il codice all'interno dei propri messaggi è bene (leggi pure "è obbligatorio per via del regolamento del forum") postare tale codice all'interno dell'apposito tag "code" presente nell'editor di testo del forum.
Pertanto, dovresti modificare il primo messaggio, levando anche i numei e lasciando dentro il tag solamente il codice vero e proprio, in questo modo:

Codice: Seleziona tutto

#! /bin/bash

i=1001
classe=""

echo "Elaborazione in corso..."
cat elenco.csv | grep INFORMATICA | (
while read riga 
do 
classe=`echo $riga | cut -d"," -f6 | cut -c -1`
if [ ${classe} = "3" ] || [ ${classe} = "4" ] || [ ${classe} = "5" ]

then

(
echo -n "$i@"
rig=$(echo $riga | cut -d"," -f6 | cut -c -2)
echo -n "$rig@"
rig=$(echo $riga | cut -d"," -f3)
echo -n "$rig@"
rig=$(echo $riga | cut -d"," -f4)
echo -n "$rig@"
rig=$(echo $riga | cut -d"," -f5)
echo $rig 
i=$(($i+1))
) >> lista.txt 
fi
done
echo "Elaborazione terminata! "
)
... e visto che dici di non aver ancora visto comandi come awk, il codice qui sopra l'ho ottenuto mettendo il tuo codice coi numeri dentro un file di testo e poi modificandolo con il seguente comando sed:

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~$ sed "s/^[0-9\. \t]*//" codice_NicoCale.txt
Ciao

p.s.:
A margine, questo comando non si può vedere:

Codice: Seleziona tutto

cat elenco.csv | grep INFORMATICA
in quanto grep prende il path del file di input come parametro, quindi:

Codice: Seleziona tutto

grep INFORMATICA elenco.csv
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
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [Risolto]Script-contatore nel ciclo

Messaggio da UbuNuovo »

Non mi sono arrivate le notifiche di nuovi messaggi.

Codice: Seleziona tutto

grep INFORMATICA elenco.csv
è effettivamente il codice corretto.
Sinceramente non ci avevo fatto caso, mi sono interessato solo ad eliminare le subshell e gli echo non necessari.
Vae hai fatto bene a farlo notare.
Salva l'Ucraina! 🇺🇦
NicoCale
Prode Principiante
Messaggi: 16
Iscrizione: domenica 18 maggio 2014, 11:12
Desktop: ubuntu
Distribuzione: Ubuntu14.04 x86_64

Re: [Risolto]Script-contatore nel ciclo

Messaggio da NicoCale »

Ho corretto il primo messaggio, scusate per le imprecisioni.
Correggerò la parte che mi avete indicato.
E per l'ennesima volta grazie per le diverse soluzioni che mi avete proposto :)
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [Risolto]Script-contatore nel ciclo

Messaggio da UbuNuovo »

Cavolo! Avevo impostato male il firewall e non mi arrivava la posta, le notifiche ora sono arrivate.
@NicoCale non c'è di che.
Ciaux
Salva l'Ucraina! 🇺🇦
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti