Creare file da file con script bash
- 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
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!
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!
Re: Creare file da file con script bash
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.
(:
(:
- 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
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.
Con questo metodo posso ottenere un file formattato nel modo che ho scritto? Come potrei procedere?Se è sintassi JSON puoi usare un interprete JSON di un linguaggio (tipo javascript) e lavorare sugli oggetti di quel linguaggio
- UbuNuovo
- 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
per "parsare" da terminale dati JSON, nei repo di Ubuntu c'è 'jq' è ottimo.
Salva l'Ucraina! 
- 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
Il fatto è che oltre che "parsare" devo ricomporre un altro file json formattato come ho scrittoUbuNuovo [url=http://forum.ubuntu-it.org/viewtopic.php?p=4890981#p4890981][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:per "parsare" da terminale dati JSON, nei repo di Ubuntu c'è 'jq' è ottimo.
- UbuNuovo
- 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
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! 
Re: Creare file da file con script bash
@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.
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.
- 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
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
ma non funziona, non riesco proprio ad utilizzare sed in questo caso, qualcuno potrebbe aiutarmi?
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
- UbuNuovo
- 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
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:
Sicuramente esistono metodi migliori, speriamo nell'intervento dei più esperti.
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"} blablaSalva l'Ucraina! 
- eaghezzi
- 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
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
ottengo un oggetto php lo trasformo e lo scrivo nel nuovo file.
non più di una decina di rghe di codice
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);
non più di una decina di rghe di codice
- UbuNuovo
- 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
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! 
- eaghezzi
- 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
Che io sappia jq non può leggere un file locale
- UbuNuovo
- 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
Parlavo di "jq - Command-line JSON processor", perché voleva creare il file con bash.
Salva l'Ucraina! 
- 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
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 formattazioneeaghezzi [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 istruzioneottengo un oggetto php lo trasformo e lo scrivo nel nuovo file.Codice: Seleziona tutto
$oggettoPHP=json_decode($riga);
non più di una decina di rghe di codice
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?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.
- UbuNuovo
- 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
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:
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_fileSalva l'Ucraina! 
Re: Creare file da file con script bash
comunque alla fine hai risolto con sed?
Per sostituire una stringa all'interno di un file:
Sostituisce tutte le occorrenze di "due" con "venti" dentro file.
(;
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
(;
- 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
No purtroppo sed mi dava dei problemi, credo per via dei caratteri speciali presenti sia nelle stringhe da sostituire che nelle stringhe sostitutive.melfnt ha scritto:comunque alla fine hai risolto con sed?
Per sostituire una stringa all'interno di un file:
Sostituisce tutte le occorrenze di "due" con "venti" dentro 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
(;
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!
Re: Creare file da file con script bash
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:
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è
- 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
Non ho fatto esempi dici?
Prova a usare sed con queste stringhe e non con quelle che hai usato e vedi che non sostituisce nullaHo 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
-
rai
- 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
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"}
$
Chi c’è in linea
Visualizzano questa sezione: Bing [Bot] e 4 ospiti
