[BASH] Sostituzione caratteri accentati

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2854
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

[BASH] Sostituzione caratteri accentati

Messaggio da DoctorStrange »

Ciao a tutti.

Ho scaricato da internet un csv con alcuni dati. Il file è sicuro, perché viene dal sito "Open Data", ma è formattato in maniera strana, con tutte le lettere accentate.
Il problema è che devo importare questi dati in hadoop per gestirli usando scala. Se ci sono caratteri non appartenenti al charset ordinario, ottengo dei dati di parsing del file.

La domanda è dunque, come posso, tramite uno script in bash ad eliminare tutte le lettere accetate?

Ho provato con:

Codice: Seleziona tutto

cat Extracted.txt | sed -e 's/attivit?/attivita/g'
Ma non funziona.

Voi, come fareste?

Grazie
Allegati
Lettere-accentate.PNG
Extracted.txt
(2.01 KiB) Scaricato 31 volte
Avatar utente
wilecoyote
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 15349
Iscrizione: giovedì 20 agosto 2009, 16:21
Desktop: Kubuntu et alii
Distribuzione: 9.04 32bit 14/18/20/22.04 LTS 64bit
Sesso: Maschile
Località: Ceranesi - Ge

Re: [BASH] Sostituzione caratteri accentati

Messaggio da wilecoyote »

) Salve, direi sinossi sed errata.

Leggi in proposito questa wiki AmministrazioneSistema/ComandiBase#sed.

Ti consiglierei l'esempio 2, come errore metti il carattere accentato e come corretto quello non accentato.

Ecco un frammento esempio:

Codice: Seleziona tutto

's|ù|u|g'
:: Ciao
ACER Extensa 5230E 2,2 Ghz cpu Celeron 900 hdd 160 GB Ram 1 GB scheda video Intel GM500
ACER Extensa 5635Z 2,2 Ghz cpu Celeron T3100 hdd 320 GB Ram 4 GB scheda video Intel Mobile 4
Quando una Finestra chiusa incontra un Pinguino la Finestra chiusa è una Finestra aperta.
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] Sostituzione caratteri accentati

Messaggio da vaeVictis »

Ciao, posta il link da cui scaricare il file.
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
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2854
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: [BASH] Sostituzione caratteri accentati

Messaggio da DoctorStrange »

Da qui:

http://www.datiopen.it/it/opendata/Regi ... _anno_2013

In alto c'è il tab "scarica -> csv -> dato completo".
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] Sostituzione caratteri accentati

Messaggio da vaeVictis »

Soluzione
Lo converti facilmente con il comando

Codice: Seleziona tutto

iconv
Il comando è:

Codice: Seleziona tutto

$ iconv -f iso8859-1 -t ascii//TRANSLIT Regione-Lazio---Cassa-integrazione-domande-lavoratori-anno-2013.csv -o outputConvertito.txt
non penso ci sia da spiegare nulla, è abbastanza intuitivo. In caso contrario, chiedi pure.


Considerazioni
Ti chiedevo da dove scaricare il file originale, perché quello che hai allegato ha un formato diverso:

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Scaricati$ file Extracted.txt 
Extracted.txt: UTF-8 Unicode text, with CRLF line terminators
vaevictis@vaevictis-N56VV:~/Scaricati$ file Regione-Lazio---Cassa-integrazione-domande-lavoratori-anno-2013.csv 
Regione-Lazio---Cassa-integrazione-domande-lavoratori-anno-2013.csv: ISO-8859 text, with CRLF line terminators
quindi in qualche modo già lo avevi manipolato.
Qualsiasi editor testuale ti visualizza il file in formato ISO-8859 in modo corretto.
Non te lo visualizzano in modo corretto "generalmente" i comandi di bash, come cat less more e via dicendo, perché lo leggono e provano a decodificarlo in UTF-8.
Infatti, di default avrai molto probabilmente, come me, l'impostazione:

Codice: Seleziona tutto

$ echo $LANG
it_IT.UTF-8
Quindi immagino che tu abbia messo l'output di uno di questi comandi (presumibilmente cat, visto che ci sono i punti interrogativi) nel file Extracted.txt e poi abbia allegato quest'ultimo.
L'unico modo in cui sono riuscito a far visualizzare correttamente al comando cat il contenuto del file scaricato dal sito di Open Data è stato andare nella voce "Terminale" dei menù a cascata del terminale, selezionare "Imposta codifica dei caratteri" e poi selezionare "Occidentale-ISO-8859-1". Però altri comandi come less continuano a sfarfallare.

En passant, il comando sed accetta direttamente un file testuale, non c'è bisogno di metterlo in pipe al comando cat come nel tuo messaggio di apertura:

Codice: Seleziona tutto

cat Extracted.txt | sed -e 's/attivit?/attivita/g'
Non puoi comunque manipolare quel file con sed, perché appunto è in formato iso-8859. Devi prima convertirlo in UTF-8 con iconv.
Se usi questa seconda strada, poi devi dare un comando sed del tipo:

Codice: Seleziona tutto

sed -e 'y/āáǎàēéěèīíǐìïōóǒòöūúǔùǖǘǚǜüĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛÜÇçÑñ/aaaaeeeeiiiiiooooouuuuuuuuuAAAAEEEEIIIIOOOOUUUUUUUUUCcNn/' path_del_file
Questo comando rimuove qualsiasi segno diacritico dalle lettere contenute nel file... anche da quelle maiuscole accentate, se quelli di Open Data sapessero scriverle :D

A me personalmente non piace questo comando sed qui sopra, anche perché la stessa operazione la puoi fare con iconv in modo più sintetico:

Codice: Seleziona tutto

$ echo "āáǎàēéěèīíǐìïōóǒòöūúǔùǖǘǚǜüĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛÜÇçÑñ" | iconv -t ascii//TRANSLIT
aaaaeeeeiiiiiooooouuuuuuuuuAAAAEEEEIIIIOOOOUUUUUUUUUCcNn
L'unico problema, in entrambi i casi, è se tu devi mantenere la codifica iniziale del file della Regione. Non mi pare sia possibile, né con iconv, né con sed, visto che il risultato del file UTF-8 a cui si applica il comando per rimuovere i segni diacritici è un file in formato ASCII.
Ultima modifica di vaeVictis il mercoledì 3 novembre 2021, 11:13, modificato 1 volta in totale.
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
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2854
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: [BASH] Sostituzione caratteri accentati

Messaggio da DoctorStrange »

Ciao VaeVictis.
Come sempre grazie per la pronta risposta. Dunque, Mi sono reso conto ora che ho allegato al mio messaggio una versione del testo che avevo già modificato manualmente per fare un test su hadoop, e dargli un testo che fosse perfettamente formattato secondo dei normalissimi caratteri alfanumerici, per vedere se il problema fosse proprio nella codifica di un charset diverso da quello che lui si aspettava.

Il sed che ho postato è stato un primo tentativo di sostituire le lettere accentate.

La domanda comunque resta: esiste un tool da riga di comando che permetta di visualizzare anche i caratteri non appartenenti al normale charset, come ad esempio il carattere "a capo riga", che è composto da "\r\n"?

Grazie
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] Sostituzione caratteri accentati

Messaggio da vaeVictis »

Non ho capito, scusami.
Il problema delle lettere accentate è risolto?
E inoltre:
La domanda comunque resta: esiste un tool da riga di comando che permetta di visualizzare anche i caratteri non appartenenti al normale charset, come ad esempio il carattere "a capo riga", che è composto da "\r\n"?
Che intendi?
Se sono presenti "\r\n" come fine riga te lo dice direttamente il comando "file".
Se converti con iconv il file non ci sono più caratteri non appartenenti ad ASCII. Anche se \r\n rimane. Se vuoi rimuoverlo, si fa tranquillamente con sed o altri comandi.
Che intendi per charset "normale" o "ordinario", comunque?
Scusa, ma non capisco.
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
gio1968
Prode Principiante
Messaggi: 42
Iscrizione: venerdì 1 maggio 2020, 22:52
Desktop: LXQt
Distribuzione: lubuntu 20.04.3 LTS
Sesso: Maschile

Re: [BASH] Sostituzione caratteri accentati

Messaggio da gio1968 »

DoctorStrange ha scritto:
mercoledì 3 novembre 2021, 11:02

La domanda comunque resta: esiste un tool da riga di comando che permetta di visualizzare anche i caratteri non appartenenti al normale charset, come ad esempio il carattere "a capo riga", che è composto da "\r\n"?
Non sono sicuro di aver capito, ma ci provo lo stesso. Forse stai cercando

Codice: Seleziona tutto

cat -e file.csv
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] Sostituzione caratteri accentati

Messaggio da vaeVictis »

gio1968 ha scritto:
mercoledì 3 novembre 2021, 12:15
DoctorStrange ha scritto:
mercoledì 3 novembre 2021, 11:02

La domanda comunque resta: esiste un tool da riga di comando che permetta di visualizzare anche i caratteri non appartenenti al normale charset, come ad esempio il carattere "a capo riga", che è composto da "\r\n"?
Non sono sicuro di aver capito, ma ci provo lo stesso. Forse stai cercando

Codice: Seleziona tutto

cat -e file.csv
@gio1968
:birra:
Mi sono accorto che ho dimenticato di aggiungere il comando che hai suggerito nel mio post precedente, quando dicevo che si vede direttamente con il comando file.
Con quel comando, vengono visualizzati sia "\r\n", sia tutti gli altri caratteri non ascii. Non vengono proprio "visualizzati", ma vengono indicati con un segnaposto.
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.»
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 10 ospiti