Creare file da file con script bash

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Qui-Gon Jinn
Prode Principiante
Messaggi: 91
Iscrizione: martedì 13 gennaio 2015, 17:15
Desktop: ubuntu
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile

Creare file da file con script bash

Messaggio da Qui-Gon Jinn »

Ciao a tutti, il mio problema è il seguente:
vorrei creare un file con una formattazione particolare tramite uno script partendo da piu file dati in input. Mi spiego meglio:

I file di input sono della forma:

file_1.est --> {"nome": [{nomex: "stringa1", nomey: int1}, {nomex:"stringa1_1", nomey: int1_1}, ... {nomex:"stringa1_n", nomey: int1_n}]}

file_2.est --> {"nome": [{nomex: "stringa2", nomey: int2}, {nomex:"stringa2_1", nomey: int2_1}, ... {nomex:"stringa2_n", nomey: int2_n}]}

Il file di output dovrebbe essere nella forma:

file_t.est --> [{"nome": [[1, int1], [2,int2]], "nomet": "stringa1"}, {"nome":[[1, int1_1]], "nomet": "stringa1_1"}, {"nome": [[2, int2_1]], "nomet": "stringa2_1"}]

In pratica quello che vorrei ottenere è un file in cui siano sintetizzate le informazioni dei file di input (anche piu di 2) però catalogate in funzione delle stringhe. Infatti nell'esempio che vi ho riportato si suppone che stringa1=stringa2 quindi le informazioni si concentrano nel file di ouput come vi ho fatto vedere.

Sapreste aiutarmi o darmi dei consigli su come procedere? Grazie a chi vorrà aiutarmi!
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: Creare file da file con script bash

Messaggio da melfnt »

Lo devi fare per forza con bash? Se è sintassi JSON puoi usare un interprete JSON di un linguaggio (tipo javascript) e lavorare sugli oggetti di quel linguaggio.

(:
Avatar utente
Qui-Gon Jinn
Prode Principiante
Messaggi: 91
Iscrizione: martedì 13 gennaio 2015, 17:15
Desktop: ubuntu
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile

Re: Creare file da file con script bash

Messaggio da Qui-Gon Jinn »

No no ho scritto bash perchè è un linguaggio con cui ho già avuto a che fare ma sono aperto a suggerimenti per ottenere il risultato voluto.
Se è sintassi JSON puoi usare un interprete JSON di un linguaggio (tipo javascript) e lavorare sugli oggetti di quel linguaggio
Con questo metodo posso ottenere un file formattato nel modo che ho scritto? Come potrei procedere?
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: Creare file da file con script bash

Messaggio da UbuNuovo »

per "parsare" da terminale dati JSON, nei repo di Ubuntu c'è 'jq' è ottimo.
Salva l'Ucraina! 🇺🇦
Avatar utente
Qui-Gon Jinn
Prode Principiante
Messaggi: 91
Iscrizione: martedì 13 gennaio 2015, 17:15
Desktop: ubuntu
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile

Re: Creare file da file con script bash

Messaggio da Qui-Gon Jinn »

Il fatto è che oltre che "parsare" devo ricomporre un altro file json formattato come ho scritto
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: Creare file da file con script bash

Messaggio da UbuNuovo »

Appunto! Noi puoi farlo con un comando, devi creare uno script che prima smonta i dati e poi li rimette insieme nel modo che vuoi tu.
Salva l'Ucraina! 🇺🇦
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: Creare file da file con script bash

Messaggio da melfnt »

@UbuNuovo: in teoria si può fare anche con un comando, ma è più comodo con un interprete JSON (cut -f1 -d\" eccetera).

Comunque non ho capito bene come avviene la trasformazione, potresti postare delle regole da seguire oppure un esempio fatto a mano?
Nel frattempo guardati il manuale di jq.
Avatar utente
Qui-Gon Jinn
Prode Principiante
Messaggi: 91
Iscrizione: martedì 13 gennaio 2015, 17:15
Desktop: ubuntu
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile

Re: Creare file da file con script bash

Messaggio da Qui-Gon Jinn »

Allora ho quasi fatto tutto, mi manca solo una parte per la quale ho davvero bisogno del vostro aiuto perchè non sto riuscendo a venirne a capo.
Dai file che vi dicevo sono riuscito ad estrapolare le informazioni giuste per poi ricomporle in un nuovo file .json, il problema adesso è la sostituzione di una stringa all'interno di un file; mi spiego meglio:
Ho una stringa cosi formata:
[{"dati":[[int0 , int1]], "nome": "string"} contenuta nella variabile line, e vorrei sostituirla con
[{"dati":[[int0 , int1],[int2, int3]], "nome": "string"} contenuta nella variabile new_line

Ho provato con

Codice: Seleziona tutto

sed -i "/c\$line/ c\ $new_line" file.json
ma non funziona, non riesco proprio ad utilizzare sed in questo caso, qualcuno potrebbe aiutarmi?
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: Creare file da file con script bash

Messaggio da UbuNuovo »

Premesso che con sed sono una schiappa, in caso di problemi con caratteri speciali, a volte ho usato un metodo grezzo ma funzionante, ovvero faccio l'escape dei caratteri problematici con sed.
Per esempio:

Codice: Seleziona tutto

8-) file='bla bla [{"dati":[[int0 , int1]], "nome": "string"} blabla'
8-) line='[{"dati":[[int0 , int1]], "nome": "string"}'
8-) new_line='[{"dati":[[int0 , int1],[int2, int3]], "nome": "string"}'
8-) linexsed=$(sed -e 's/\[/\\[/g' -e 's/"/\\"/g' <<< "$line")
8-) new_linexsed=$(sed -e 's/\[/\\[/g' -e 's/"/\\"/g' <<< "$new_line")
8-) sed "s/$linexsed/$new_linexsed/" <<< "$file"
bla bla [{"dati":[[int0 , int1],[int2, int3]], "nome": "string"} blabla
Sicuramente esistono metodi migliori, speriamo nell'intervento dei più esperti.
Salva l'Ucraina! 🇺🇦
Avatar utente
eaghezzi
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 725
Iscrizione: martedì 21 luglio 2009, 10:27
Desktop: Lubuntu
Distribuzione: Ubuntu 14.04.1 LTS i686
Sesso: Maschile
Località: Valleambrosia

Re: Creare file da file con script bash

Messaggio da eaghezzi »

in teoria è molto semplice

quasi tutti i linguaggi hanno funzioni per gestire oggetti json

per esempio in php

apro il file leggo una riga (sperando che ogni oggetto json sia su una riga sola)
metto la riga nella var $riga
con la sguente istruzione

Codice: Seleziona tutto

$oggettoPHP=json_decode($riga);
ottengo un oggetto php lo trasformo e lo scrivo nel nuovo file.
non più di una decina di rghe di codice
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: Creare file da file con script bash

Messaggio da UbuNuovo »

Si, con PHP si maneggiano bene, ma a quanto pare non ha usato nemmeno 'jq' altrimenti non avrebbe avuto bisogno di sed. :)
Salva l'Ucraina! 🇺🇦
Avatar utente
eaghezzi
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 725
Iscrizione: martedì 21 luglio 2009, 10:27
Desktop: Lubuntu
Distribuzione: Ubuntu 14.04.1 LTS i686
Sesso: Maschile
Località: Valleambrosia

Re: Creare file da file con script bash

Messaggio da eaghezzi »

Che io sappia jq non può leggere un file locale
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: Creare file da file con script bash

Messaggio da UbuNuovo »

Parlavo di "jq - Command-line JSON processor", perché voleva creare il file con bash.
Salva l'Ucraina! 🇺🇦
Avatar utente
Qui-Gon Jinn
Prode Principiante
Messaggi: 91
Iscrizione: martedì 13 gennaio 2015, 17:15
Desktop: ubuntu
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile

Re: Creare file da file con script bash

Messaggio da Qui-Gon Jinn »

eaghezzi [url=http://forum.ubuntu-it.org/viewtopic.php?p=4891849#p4891849][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:in teoria è molto semplice

quasi tutti i linguaggi hanno funzioni per gestire oggetti json

per esempio in php

apro il file leggo una riga (sperando che ogni oggetto json sia su una riga sola)
metto la riga nella var $riga
con la sguente istruzione

Codice: Seleziona tutto

$oggettoPHP=json_decode($riga);
ottengo un oggetto php lo trasformo e lo scrivo nel nuovo file.
non più di una decina di rghe di codice
Purtroppo non so usare php e comunque i file json sono tutti su una riga, in ogni caso l'estrazione dei dati non è un problema, il problema è reinserirli nel posto giusto con la giusta formattazione
UbuNuovo ha scritto:Si, con PHP si maneggiano bene, ma a quanto pare non ha usato nemmeno 'jq' altrimenti non avrebbe avuto bisogno di sed. :)
Ho usato jq per modellare i file in input in modo tale da ottenere piu righe coi vari oggetti piuttosto che tutto sulla stessa riga, come avrei potuto usare jq al posto di sed?
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: Creare file da file con script bash

Messaggio da UbuNuovo »

Estrai ogni valore pulito (o quelli che ti interessano) e lo assegni ad una variabile (o i vari valori di ogni riga ad un array).
Avendo i valori separati e puliti puoi modificarli e rimontarli in una stringa nel modo che vuoi; crei le stringa nel classico modo, per esempio ciclando le righe:

Codice: Seleziona tutto

echo "quello che voglio $valore1 bla $valore2 blabla $valore3 etc " >> nome_file
Salva l'Ucraina! 🇺🇦
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: Creare file da file con script bash

Messaggio da melfnt »

comunque alla fine hai risolto con sed?
Per sostituire una stringa all'interno di un file:

Codice: Seleziona tutto

$ cat file
uno due tre quattro
due uno due
tre quattro cinque
uno due sette nove
$ line=due
$ newline=venti
$ cat file | sed "s/$line/$newline/g"
uno venti tre quattro
venti uno venti
tre quattro cinque
uno venti sette nove
Sostituisce tutte le occorrenze di "due" con "venti" dentro file.
(;
Avatar utente
Qui-Gon Jinn
Prode Principiante
Messaggi: 91
Iscrizione: martedì 13 gennaio 2015, 17:15
Desktop: ubuntu
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile

Re: Creare file da file con script bash

Messaggio da Qui-Gon Jinn »

melfnt ha scritto:comunque alla fine hai risolto con sed?
Per sostituire una stringa all'interno di un file:

Codice: Seleziona tutto

$ cat file
uno due tre quattro
due uno due
tre quattro cinque
uno due sette nove
$ line=due
$ newline=venti
$ cat file | sed "s/$line/$newline/g"
uno venti tre quattro
venti uno venti
tre quattro cinque
uno venti sette nove
Sostituisce tutte le occorrenze di "due" con "venti" dentro file.
(;
No purtroppo sed mi dava dei problemi, credo per via dei caratteri speciali presenti sia nelle stringhe da sostituire che nelle stringhe sostitutive.
HO risolto però componendo l'opzione "-v" di grep con la ridirezione dell'output su file. Creando delle copie sono riuscito a risolvere il problema, anche se sicuramente ci sarà un modo migliore per procedere.
Comunque i vostri consigli sono stati preziosi, grazie a tutti!
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: Creare file da file con script bash

Messaggio da melfnt »

Sinceramente non ho capito molto come hai fatto, anche perché non hai né postato codice né esempi.
;)

Comunque, sia sed che grep funzionano con i caratteri speciali:

Codice: Seleziona tutto

$ cat file
uno duè tre quattro
cinque sei
duè uno duè
uno duè sette novè
$ line=duè
$ newline=vèntì
$ cat file | sed "s/$line/$newline/g"
uno vèntì tre quattro
cinque sei
vèntì uno vèntì
uno vèntì sette novè
Avatar utente
Qui-Gon Jinn
Prode Principiante
Messaggi: 91
Iscrizione: martedì 13 gennaio 2015, 17:15
Desktop: ubuntu
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile

Re: Creare file da file con script bash

Messaggio da Qui-Gon Jinn »

Non ho fatto esempi dici?
Ho una stringa cosi formata:
[{"dati":[[int0 , int1]], "nome": "string"} contenuta nella variabile line, e vorrei sostituirla con
[{"dati":[[int0 , int1],[int2, int3]], "nome": "string"} contenuta nella variabile new_line
Prova a usare sed con queste stringhe e non con quelle che hai usato e vedi che non sostituisce nulla
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2886
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Creare file da file con script bash

Messaggio da rai »

a me pare che escapando i caratteri problematici funziona con sed

Codice: Seleziona tutto

$ line='[{"dati":[[int0 , int1]], "nome": "string"}'
$ new_line=$(sed 's/\"nome\"/\[int2\,int3\]\]\,&/' <<< $line)
$ echo $new_line 
[{"dati":[[int0 , int1]], [int2,int3]],"nome": "string"}
$ 
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: Bing [Bot] e 4 ospiti