[Risolto][BASH] Ordinare più variabili

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Thor_92
Prode Principiante
Messaggi: 3
Iscrizione: martedì 28 aprile 2015, 17:17
Desktop: unity
Distribuzione: Ubuntu 15.04 Vivid Vervet

[Risolto][BASH] Ordinare più variabili

Messaggio da Thor_92 »

Salve a tutti,
sono nuovo nel forum e quindi mi presento...

Ho un file.txt che ha delle stringhe con dei campi delimitati da ";". Ogni riga ha delle informazioni, ad esempio: <nome>;<cognome>;<anno>.

Io devo cercare tutte quelle con un dato cognome, ordinarle in base al nome e stamparle in output.
La mia soluzione è questa:

Codice: Seleziona tutto

#!/bin/bash

cognome=""

present=false
echo "******************************************"
echo
echo -n "Inserire il cognome da cercare: "
read cognome
echo

listaCognomi=`cut -f2 -d';' studenti.txt | sed 's/<//g' | sed 's/>//g'`

righeCognomi=$(fgrep -i $cognome studenti.txt | wc -l | awk '{print $1}' )
riga=1

echo "Gli studenti con questo cognome sono: $righeCognomi"
echo
for studenti in $listaCognomi; do
  	if [ "`echo $listaCognomi | fgrep -i $cognome`" ]
  	then
		nome=`fgrep -i $cognome studenti.txt | cut -f1 -d';' | sed 's/<//g' | sed 's/>//g' | sort -d`
		cognomi=`fgrep -i $cognome studenti.txt | cut -f2 -d';' | sed 's/<//g' | sed 's/>//g'`
		matricola=`fgrep -i $cognome studenti.txt | cut -f3 -d';' | sed 's/<//g' | sed 's/>//g'`
		anno=`fgrep -i $cognome studenti.txt | cut -f4 -d';' | sed 's/<//g' | sed 's/>//g'`

for i in $matricola; do
		while [ $riga -le $righeCognomi ]; do 
			echo Nome: $(echo $nome | cut -f$riga -d' ')
    			echo Cognome: $(echo $cognomi | cut -f$riga -d' ')
    			echo Matricola: $(echo $matricola | cut -f$riga -d' ')
			echo Anno: $(echo $anno | cut -f$riga -d' ')
			let riga+=1
			echo
		done
	done
	
	else
		present=true
	fi
done
if [ $present == true ];then 
	echo "Il cognome inserito non è presente nell'elenco"
	echo
fi	
Il problema è che così mi ordina i nomi ma non il resto, ossia ad esempio mi stampa:

Codice: Seleziona tutto

Nome: Mario
Cognome: Rossi
Matricola: 363456
Anno: 2

Nome: Matteo
Cognome: Rossi
Matricola: 321433
Anno: 1

Nome: Alessandro
Cognome: Rossi
Matricola: 213456
Anno: 1
dove matricole e anni non corrispondono a quel dato studente.
In attesa di qualche risposta, grazie.
ciao
Ultima modifica di Thor_92 il venerdì 1 maggio 2015, 9:17, modificato 1 volta in totale.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [BASH] Ordinare più variabili

Messaggio da vaeVictis »

Dai un'occhiata qui
Dopo il sort, del codice nell'altra discussione, puoi tranquillamente stampare a video i dati come con la formattazione che preferisci.

p.s.:
tieni in considerazione che ogni volta che usi il comando fgrep* il tuo programma rilegge il file... che non è proprio il massimo.

*) fgrep è deprecato, come puoi vedere nella manpage del comando. Si usa grep con l'opzione -F
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: [BASH] Ordinare più variabili

Messaggio da vaeVictis »

p.s.:
così

Codice: Seleziona tutto

#! /bin/bash

#Parametri Globali
formattazioneColonne=( Nome Cognome Matricola Anno )
sortColumn=1

[[ $# -ne 2 ]] && echo -e "Usage:\n$0 cognome path_file"
[[ -f "$2" ]] || echo -e "$2: il file non esiste o non si hanno i permessi"


while read line; do
    if [[ `echo $line | cut -f 2 -d\;` == "$1" ]]; then
      echo $line;
    fi
done < "$2"| sort -t ";" -k "$sortColumn" |
while IFS=";" read -ra result;
  do
    i=0
    for token in "${result[@]}"; do
    echo -ne "${formattazioneColonne[$i]}: $token\n"
    ((++i))
    done
    echo ""
done
Per esempio, con un file così

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/Bash/RiordinaFileDB$ cat FileDB.txt 
Leonardo;Da Vinci;12345;2
Il fratello di Pippo;Baudo;6789;1
Michelangelo;Buonarroti;85236;3
Rocco;Siffredi;696969;1
Pippo;Baudo;1788;3
ottieni un output del tipo

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/Bash/RiordinaFileDB$ ./RiordinaFileDB.sh Baudo FileDB.txt 
Nome: Il fratello di Pippo
Cognome: Baudo
Matricola: 6789
Anno: 1

Nome: Pippo
Cognome: Baudo
Matricola: 1788
Anno: 3

Ti consiglio di stampare anche l'ultima riga bianca.
Io ho evitato di dilungarmi su commenti e considerazioni, ma, se hai qualche dubbio, chiedi pure.
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.»
Thor_92
Prode Principiante
Messaggi: 3
Iscrizione: martedì 28 aprile 2015, 17:17
Desktop: unity
Distribuzione: Ubuntu 15.04 Vivid Vervet

Re: [BASH] Ordinare più variabili

Messaggio da Thor_92 »

Grazie, delle risposte domani provo e ti faccio sapere.
Thor_92
Prode Principiante
Messaggi: 3
Iscrizione: martedì 28 aprile 2015, 17:17
Desktop: unity
Distribuzione: Ubuntu 15.04 Vivid Vervet

Re: [BASH] Ordinare più variabili

Messaggio da Thor_92 »

Grazie, ho risolto, ottima idea, anche se alla fine ho fatto un po' diverso. Ciao
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti