[Risolto] Unire due file con il comando join

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
JordanDunk
Prode Principiante
Messaggi: 55
Iscrizione: lunedì 24 aprile 2017, 15:48
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

[Risolto] Unire due file con il comando join

Messaggio da JordanDunk »

Buongiorno a tutti, sto cercando di unire il file passwd e il file group. Ho usato i seguenti comandi :
sort passwd
sort -n group
join -t ":" -1 4 -2 3 -o 1.1 2.1 passwd group



#1 4 -2 3 fai il join sul campo numero 4 del file 1 e nel campo numero 3 del file 2
#-o 1.1 2.1 1.7 mostra come output il campo numero 1 del file 1, il campo numero 1 del file 2

però il terminale mi da il seguente errore: join: passwd:3: is not sorted: Utente4:444444:89:178:number four:/home/four:/bin/bash

Grazie in anticipo :)
Ultima modifica di JordanDunk il martedì 9 maggio 2017, 11:06, modificato 1 volta in totale.
ivantu
Rampante Reduce
Rampante Reduce
Messaggi: 6725
Iscrizione: sabato 8 giugno 2013, 9:25
Desktop: Ubuntu Lubuntu Mate
Distribuzione: 22.04 LTS; 24.04 LTS
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da ivantu »

i file contengono tabelle? o è solo del testo?
Buona giornata utenti del forum. :ciao: ivantu
JordanDunk
Prode Principiante
Messaggi: 55
Iscrizione: lunedì 24 aprile 2017, 15:48
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da JordanDunk »

solo testo :)
ivantu
Rampante Reduce
Rampante Reduce
Messaggi: 6725
Iscrizione: sabato 8 giugno 2013, 9:25
Desktop: Ubuntu Lubuntu Mate
Distribuzione: 22.04 LTS; 24.04 LTS
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da ivantu »

prova a guardare questa guida unix-join

non conosco il comando, ma dal link sembra che i valori vadano prima dell'opzione
Buona giornata utenti del forum. :ciao: ivantu
JordanDunk
Prode Principiante
Messaggi: 55
Iscrizione: lunedì 24 aprile 2017, 15:48
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da JordanDunk »

va bene ci ho dato un'occhiata ma non vedo cose molto utili... non capisco perchè non mi ordina il file
ivantu
Rampante Reduce
Rampante Reduce
Messaggi: 6725
Iscrizione: sabato 8 giugno 2013, 9:25
Desktop: Ubuntu Lubuntu Mate
Distribuzione: 22.04 LTS; 24.04 LTS
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da ivantu »

posta un esempio su contenuto dei due file
Buona giornata utenti del forum. :ciao: ivantu
JordanDunk
Prode Principiante
Messaggi: 55
Iscrizione: lunedì 24 aprile 2017, 15:48
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da JordanDunk »

file1: Utente1:111111:25:1000:number one:/home/one:/bin/bash
Utente2:222222:37:1000:number two:/home/two:/bin/bash
Utente3:333333:46:200:number three:/home/three:/bin/bash
Utente4:444444:89:178:number four:/home/four:/bin/bash

file2: operaio:1000
capo:178
vice capo:200
responsabile:49
ivantu
Rampante Reduce
Rampante Reduce
Messaggi: 6725
Iscrizione: sabato 8 giugno 2013, 9:25
Desktop: Ubuntu Lubuntu Mate
Distribuzione: 22.04 LTS; 24.04 LTS
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da ivantu »

se dai invece il comando

Codice: Seleziona tutto

join -1 4 -2 3 -t : -o 1.1,2.1 passwd group
cosa ti risponde? ci sono errori??
Buona giornata utenti del forum. :ciao: ivantu
JordanDunk
Prode Principiante
Messaggi: 55
Iscrizione: lunedì 24 aprile 2017, 15:48
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da JordanDunk »

mi da questo errore: join: passwd:3: is not sorted: Utente3:333333:46:200:number three:/home/three:/bin/bash
ivantu
Rampante Reduce
Rampante Reduce
Messaggi: 6725
Iscrizione: sabato 8 giugno 2013, 9:25
Desktop: Ubuntu Lubuntu Mate
Distribuzione: 22.04 LTS; 24.04 LTS
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da ivantu »

al posto dei ":" modifica il comando con la ',' (virgola)

Codice: Seleziona tutto

join -1 4 -2 3 -t , -o 1.1,2.1 passwd group
se vuoi che il risultato faccia un nuovo file

Codice: Seleziona tutto

join -1 4 -2 3 -t , -o 1.1,2.1 passwd group > output
Buona giornata utenti del forum. :ciao: ivantu
JordanDunk
Prode Principiante
Messaggi: 55
Iscrizione: lunedì 24 aprile 2017, 15:48
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da JordanDunk »

cosi funziona, ma non nel modo corretto. Mi da questo output per ogni account

Utente1:111111:25:1000:number one:/home/one:/bin/bash, operaio:1000
Utente1:111111:25:1000:number one:/home/one:/bin/bash, capo:178
Utente1:111111:25:1000:number one:/home/one:/bin/bash, vice capo:200
Utente1:111111:25:1000:number one:/home/one:/bin/bash, responsabile:49
ivantu
Rampante Reduce
Rampante Reduce
Messaggi: 6725
Iscrizione: sabato 8 giugno 2013, 9:25
Desktop: Ubuntu Lubuntu Mate
Distribuzione: 22.04 LTS; 24.04 LTS
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da ivantu »

JordanDunk [url=http://forum.ubuntu-it.org/viewtopic.php?p=4977827#p4977827][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:cosi funziona, ma non nel modo corretto. Mi da questo output per ogni account

Utente1:111111:25:1000:number one:/home/one:/bin/bash, operaio:1000
Utente1:111111:25:1000:number one:/home/one:/bin/bash, capo:178
Utente1:111111:25:1000:number one:/home/one:/bin/bash, vice capo:200
Utente1:111111:25:1000:number one:/home/one:/bin/bash, responsabile:49
e come lo vorresti questo output??
bisogna trovare un altro comando, o semplicemente lo vai a modificare manualmente Per poi hai soli 4 utenti?

io ho fatto delle prove, mi risulta corretto Utente1 a susseguire Utente2 ecc...
strano che ti dia sempre Utente1.
Buona giornata utenti del forum. :ciao: ivantu
JordanDunk
Prode Principiante
Messaggi: 55
Iscrizione: lunedì 24 aprile 2017, 15:48
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da JordanDunk »

Dopo a seguire mi da anche tutti gli altri utenti ma io vorrei un output cosi:

Utente1 operaio
Utente2 operaio
utente3 vicecapo

e basta, senza tutti gli altri campi
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2886
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Unire due file con il comando join

Messaggio da rai »

JordanDunk ha scritto:Dopo a seguire mi da anche tutti gli altri utenti ma io vorrei un output cosi:

Utente1 operaio
Utente2 operaio
utente3 vicecapo

e basta, senza tutti gli altri campi
ma _devi_ usare proprio join per qualche motivo?

lo dico perché forse in questo caso ci sono strumenti più pratici (awk p.es.) dato anche che non saresti costretto a ordinare gli input cosa invece necessaria col join

Codice: Seleziona tutto

/tmp $ cat file1
Utente1:111111:25:1000:number one:/home/one:/bin/bash
Utente2:222222:37:1000:number two:/home/two:/bin/bash
Utente3:333333:46:200:number three:/home/three:/bin/bash
Utente4:444444:89:178:number four:/home/four:/bin/bash
/tmp $ cat file2
operaio:1000
capo:178
vice capo:200
responsabile:49
/tmp $ join -1 4 -2 2 -t :  -o 1.1,2.1 <(sort -t : -nr -k 4 file1) <(sort -t : -nr -k 2 file2)
Utente2:operaio
Utente1:operaio
Utente3:vice capo
Utente4:capo

Codice: Seleziona tutto

/tmp $ awk -F: 'FNR==NR {a[$2]=$1; next} { if ($4 in a) {print $1 " " a[$4]}}' file2 file1
Utente1 operaio
Utente2 operaio
Utente3 vice capo
Utente4 capo
... se ho capito quello che vuoi ottenere
JordanDunk
Prode Principiante
Messaggi: 55
Iscrizione: lunedì 24 aprile 2017, 15:48
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da JordanDunk »

Join non devo usarlo per forza, mi sembrava il più pratico. Non conoscevo questa possibilità di awk :)
JordanDunk
Prode Principiante
Messaggi: 55
Iscrizione: lunedì 24 aprile 2017, 15:48
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da JordanDunk »

puoi spiegarmi il comando /tmp $ awk -F: 'FNR==NR {a[$2]=$1; next} { if ($4 in a) {print $1 " " a[$4]}}' file2 file1 gentilmente ?
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2886
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Unire due file con il comando join

Messaggio da rai »

awk legge successivamente, in ordine da sinistra a destra, i file di input che chiudono la riga di comando

l'opzione -F: indica a awk che il separatore tra i vari campi di ogni record sono i due punti (quello predefinito è lo spazio)

NR e FNR sono due variabili intrinseche di awk
NR registra il numero complessivo di record letti ed è sempre crescente.
FNR contiene il numero di record letti nell'inputfile corrente e viene resettato ad ogni inizio di nuovo file.

Quindi NR==FNR è una condizione che si può verificare solo nel primo file e garantisce che sugli altri file di input non venga eseguito il blocco seguente tra graffe:
in quel blocco crea l'array associativo che ho chiamato `a', una specie di dizionario KEY:VALUE
nel tuo caso con a[$2]=$1 KEY è il secondo campo ($2) e VALUE è il primo campo($1) del primo inputfile (il tuo file2): in questo modo hai memorizzato in awk le stringhe che ti serve confrontare col secondo inputfile;

finito di leggere il primo inputfile, per ogni record del secondo (il tuo file1) awk verifica se tra le chiavi dell'array è presente la stringa del quarto campo: lo fa con la condizione: if ($4 in a) e in caso positivo stampa quello che ti serve: il primo campo del file1 e la stringa corrispondente che avevamo salvato nell'array

Ti suggerisco di studiare awk da esempi e facendo riferimento soprattutto a http://www.gnu.org/software/gawk/manual/gawk.html da cui all'inizio mi ero sentito schiacciato per le dimensioni ma che consiglio perchè è scritto con chiarezza e senza presumere che il lettore abbia conoscenze iniziatiche
ivantu
Rampante Reduce
Rampante Reduce
Messaggi: 6725
Iscrizione: sabato 8 giugno 2013, 9:25
Desktop: Ubuntu Lubuntu Mate
Distribuzione: 22.04 LTS; 24.04 LTS
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da ivantu »

JordanDunk [url=http://forum.ubuntu-it.org/viewtopic.php?p=4979273#p4979273][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:puoi spiegarmi il comando /tmp $ awk -F: 'FNR==NR {a[$2]=$1; next} { if ($4 in a) {print $1 " " a[$4]}}' file2 file1 gentilmente ?
tutti i caratteri inseriti precendemente da questi :~$ riguardano le path di inserimento/posizionamento dal terminale
/tmp è solo una parte della path, nullo con il comando.
Buona giornata utenti del forum. :ciao: ivantu
JordanDunk
Prode Principiante
Messaggi: 55
Iscrizione: lunedì 24 aprile 2017, 15:48
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

Re: Unire due file con il comando join

Messaggio da JordanDunk »

Va bene, grazie mille per l'aiuto :) :) :)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti