AWK - Programmazione BASH controllo, aiuto!

Dieguitos94

Utente Attivo
268
11
CPU
intel i7 - 6700
Dissipatore
ARCTIC Freezer 7 Pro Rev. 2
Scheda Madre
Msi H170 Gaming M3
HDD
SSD: Samsung 850evo 250 GB + HDD WD Black 1TB
RAM
Corsair Vengeance 2133 Mhz 2x8
GPU
Gigabyte Nvidia GTX 1060 6GB Windforce
Monitor
HP Pavillon x24w
PSU
EVGA Supernova G3 - 550w
Case
NZXT H440 V2
Periferiche
Keyboard: Razer Blackwidow Chroma
OS
Windows 10
Salve a tutti! Sto facendo un progetto nel quale inserisco in un file di testo un'anagrafica degli studenti nel formato

nome;cognome;matricola;anno

Con una funzione richiesta poi, devo poter cercare per cognome uno studente e stamparlo nel formato;
Nome: Pippo
Cognome: Rossi
Matricola 123456
Anno: 4

E' ovviamente possibile che esistano più studenti con cognome Rossi e quindi il programma mi stampa egregiamente tutti gli studenti con cognome Rossi con la formattazione vista sopra.

Il problema sta nel fatto che, se per esempio "Rossi" fosse il nome, il programma mi stampa anche lo studente di nome Rossi (e non di cognome, come mi richiede l'esercizio).
Quindi se in anagrafica io ho:
Pippo;Rossi;123456;4
Rossi;Pippo;123457;2

In seguito alla presa in input che richiede di stampare solo gli studenti con cognome "Rossi" il programma mi stamperà sia la prima che la seconda riga, ovvero anche quella con lo studente Rossi Pippo(dove Pippo è ovviamente il cognome != Rossi).
Lo spezzone di codice che ho usato è il seguente:

Bash:
echo "Immettere il cognome della persona da ricercare"
read cognome

cognome="$(tr [A-Z] [a-z] <<< "$cognome")"
cut -d";" -f2 dati.txt | grep -w -q $cognome

if (( $? != 0 )); then

    echo ""
    sort -t \; -k 1 dati.txt | awk 'tolower($1) ~ /'$cognome'/{split($1,a,";")
        printf "     Nome: %s\n  Cognome: %s\nMatricola: %s\n     Anno: %s\n\n", a[1], a[2], a[3], a[4]}'
    echo "Premere INIVIO per tornare al menù principale"
    read

else

    echo $sfondorosso"ERRORE"$normale "Non è stato trovato nessuno studente con questo cognome"
    echo "Ritorno al menù principale..."
    return
fi

Avevo pensato di aggiungere un if che controlla se il valore di a[1] è uguale al cognome ma mi trovo in seria difficoltà con questo awk.
idee?
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Fai prima il grep in cui cerchi il cognome composto da ;cognome, e poi fai il cut. Comunque è più efficiente fare prima il grep e poi il cut.
 

Dieguitos94

Utente Attivo
268
11
CPU
intel i7 - 6700
Dissipatore
ARCTIC Freezer 7 Pro Rev. 2
Scheda Madre
Msi H170 Gaming M3
HDD
SSD: Samsung 850evo 250 GB + HDD WD Black 1TB
RAM
Corsair Vengeance 2133 Mhz 2x8
GPU
Gigabyte Nvidia GTX 1060 6GB Windforce
Monitor
HP Pavillon x24w
PSU
EVGA Supernova G3 - 550w
Case
NZXT H440 V2
Periferiche
Keyboard: Razer Blackwidow Chroma
OS
Windows 10
Fai prima il grep in cui cerchi il cognome composto da ;cognome, e poi fai il cut. Comunque è più efficiente fare prima il grep e poi il cut.
Scusami, non capisco.. potresti spiegarti meglio?

Ho praticamente invertito i due comandi ed ora ho:
grep -q -w $cognome dati.txt | cut -d";" -f2

ma non trova niente..

L'idea di base è che in teoria non faccio prima il grep perchè il grep cerca su tutto il file e quindi se sto cercando "Pippo" come cognome ed ho una persona che si chiama Pippo;Bello;123456;2 il grep senza le restrizioni del cut prende anche questa stringa!
 

Andretti60

Utente Èlite
6,440
5,091
Il cognome è tra due punti e virgola, mentre il nome è solo seguito da uno, quindi fai il grep di cognome incluso tra due punti e virgola.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!