[Risolto]Cerca e trasforma data in file .txt

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
steff
Moderatore Globale
Moderatore Globale
Messaggi: 40301
Iscrizione: domenica 18 febbraio 2007, 19:48
Desktop: LXQt+labwc
Distribuzione: Arch; Debian; Ubuntu Server
Sesso: Maschile
Località: Toscana
Contatti:

[Risolto]Cerca e trasforma data in file .txt

Messaggio da steff »

Ho un file di testo di esportazione che contiene le date nel formato

Codice: Seleziona tutto

19-01-12
18-01-28
21-04-26
ecc

yy-mm-dd
Domanda ai maestri di bash presenti: sarebbe fattibile uno script che cerca uno per uno e lo rimpiazza con tipo

Codice: Seleziona tutto

venerdì, 25 giugno 2021
(il giorno della settimana sarebbe un optional)?
Hai fatto un backup oggi? Ieri?? Quando???
La Documentazione da consultare e la FAQ sul uso del forum
Sistemi: LXQt - semplice, modulare e configurabile + *ubuntu in Vbox
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Cerca e trasforma data in file .txt

Messaggio da vaeVictis »

Supponendo che tu legga la data nella variabile "string", usa:

Codice: Seleziona tutto

date --date="$string" "+%A, %d %B %Y"

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~$ foo="19-01-12                       
18-01-28
21-04-26"
vaevictis@vaevictis-N56VV:~$ for string in $foo; do date --date="$string" "+%A, %d %B %Y"; done
sabato, 12 gennaio 2019
domenica, 28 gennaio 2018
lunedì, 26 aprile 2021
Ovviamente i nomi dei giorni e dei mesi cambiano in virtù del locale.
Se il locale è italiano, no problem. Altrimenti devi fare un parsing ulteriore della stringa ottenuto.


Se devi anche cercare le stringhe di date nel formato che hai specificato, usa egrep:

Codice: Seleziona tutto

egrep -o  "[0-9]{2}-[0-9]{2}-[0-9]{2}"
Ad esempio:

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~$ echo "asa dsad 19-01-12 dasdada " | egrep -o  "[0-9]{2}-[0-9]{2}-[0-9]{2}"
19-01-12
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
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4445
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Cerca e trasforma data in file .txt

Messaggio da UbuNuovo »

Credo che gli serva un esempio di script.
Con un file contenente i dati da cambiare dati.txt

Codice: Seleziona tutto

 8-) cat dati.txt 
bla bla 19-01-12 blabla
blabla 18-01-28 bla bla
bla bla 21-04-26 blabla
potresti usare uno script di questo tipo:

Codice: Seleziona tutto

8-) cat script.sh
#!/bin/bash

nome_file="dati.txt"

while read l;do
	data=$(grep -Eo '[0-9]{2}-[0-9]{2}-[0-9]{2}' <<< "$l")
	data_txt=$(date --date="$data" "+%A, %d %B %Y")
	sed -i "s/$data/$data_txt/" "$nome_file"
done < "$nome_file"
eseguo:

Codice: Seleziona tutto

 8-) ./script.sh 
verifico:

Codice: Seleziona tutto

 8-) cat dati.txt 
bla bla sabato, 12 gennaio 2019 blabla
blabla domenica, 28 gennaio 2018 bla bla
bla bla lunedì, 26 aprile 2021 blabla
 8-) 
Semmai prima provalo senza l'opzione -i di sed e vedi l'output su terminale, oppure provalo su una copia del file.
Salva l'Ucraina! 🇺🇦
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Cerca e trasforma data in file .txt

Messaggio da vaeVictis »

Due dubbi sullo script.
Leggi riga per riga e poi applichi sed a tutto il file? Mi sembra un po' uno spreco (in termini di tempo di esecuzione).
Credo inoltre che, se sulla stessa riga ci sono più di una data uguale, lo script modifica la prima.

Io procederei diversamente.
Estrarrei prima dal file tutte le date con grep, poi le metterei in un array, poi eliminerei i doppioni, poi farei un ciclo sull'array e la corrispondente modifica con sed, ma con l'opzione g per fare eventuali modifiche multiple.
Anzi, a voler essere proprio buoni, prima creerei una stringa per dare un unico comando sed e poi lo eseguirei.
Ultima modifica di vaeVictis il sabato 26 giugno 2021, 2:46, modificato 2 volte 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
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4445
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Cerca e trasforma data in file .txt

Messaggio da UbuNuovo »

Ho preso spunto dai dati di esempio e anzi ci ho aggiunto del testo intorno.
Credo che non convenga complicare le cose semplici, se non serve.
Comunque può essere interessante vedere lo script che dici.
Salva l'Ucraina! 🇺🇦
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Cerca e trasforma data in file .txt

Messaggio da vaeVictis »

Comunque può essere interessante vedere lo script che dici.
Se pathFile è la variabile contenente il path del file, lo script è:

Codice: Seleziona tutto

elencoDate=($(egrep -o "[0-9]{2}-[0-9]{2}-[0-9]{2}" "$pathFile" | sort | uniq))
comando=''
for item in ${elencoDate[@]}
do 
	comando+="s/"$item"/"$(date --date="$item" "+%A, %d %B %Y")"/g;"
done
sed -e "$comando" "$pathFile" 
(senza opzione i per sed, che ovviamente va aggiunta dopo aver testato lo script)

Spiegazione:
Contenuto del file di dati:

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ cat foo.txt 
bla bla 19-01-12 blabla
blabla 18-01-28 bla bla
bla bla 21-04-26 blabla

bla bla 19-01-12 blabla blabla 18-01-28 bla bla
blabla 18-01-28 bla bla blabla 18-01-28 bla bla
bla bla 21-04-26 blabla bla bla 21-04-26 blabla

bla bla 19-01-12 blabla
blabla 18-01-28 bla bla bla bla 19-01-12 blabla
bla bla 21-04-26 blabla blabla 18-01-28 bla bla bla bla 19-01-12 blabla
Creo l'elenco delle date (in ordine alfabetico senza ripetizioni, nel caso il file contenga più date uguali):

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ elencoDate=($(egrep -o "[0-9]{2}-[0-9]{2}-[0-9]{2}" foo.txt | sort | uniq))
Pertanto ottengo

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ echo ${elencoDate[@]}
18-01-28 19-01-12 21-04-26
Genero la stringa del comando per sed così:

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ comando=''
vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ for item in ${elencoDate[@]}; do comando+="s/"$item"/"$(date --date="$item" "+%A, %d %B %Y")"/g;"; done
Quindi ottengo

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ echo $comando 
s/18-01-28/domenica, 28 gennaio 2018/g;s/19-01-12/sabato, 12 gennaio 2019/g;s/21-04-26/lunedì, 26 aprile 2021/g;
Do il comando sed con l'istruzione appena creata:

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ sed -e "$comando" foo.txt 
bla bla sabato, 12 gennaio 2019 blabla
blabla domenica, 28 gennaio 2018 bla bla
bla bla lunedì, 26 aprile 2021 blabla

bla bla sabato, 12 gennaio 2019 blabla blabla domenica, 28 gennaio 2018 bla bla
blabla domenica, 28 gennaio 2018 bla bla blabla domenica, 28 gennaio 2018 bla bla
bla bla lunedì, 26 aprile 2021 blabla bla bla lunedì, 26 aprile 2021 blabla

bla bla sabato, 12 gennaio 2019 blabla
blabla domenica, 28 gennaio 2018 bla bla bla bla sabato, 12 gennaio 2019 blabla
bla bla lunedì, 26 aprile 2021 blabla blabla domenica, 28 gennaio 2018 bla bla bla bla sabato, 12 gennaio 2019 blabla
Ho preso spunto dai dati di esempio e anzi ci ho aggiunto del testo intorno.
Pure io.
Credo che non convenga complicare le cose semplici, se non serve.
Also, Dude, "complicare" is not the preferred nomenclature. Generalizzare, please. :lol: :D
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
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4445
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Cerca e trasforma data in file .txt

Messaggio da UbuNuovo »

:nono: Che razza di comando chilometrico ti verrebbe fuori.
Quello script può andar bene per poche date, sed non ce la fa a gestire troppi argomenti. L'unico vantaggio si otterrebbe in caso di date ripetute.
Semmai per migliorare le prestazioni si potrebbe scrivere riga per riga su un file temporaneo, tipo:

Codice: Seleziona tutto

#!/bin/bash

file_orig="./dati.txt"
file_temp=$(mktemp)
while read l;do
	data=$(grep -Eo '[0-9]{2}-[0-9]{2}-[0-9]{2}' <<< "$l")
	data_txt=$(date --date="$data" "+%A, %d %B %Y")
	sed "s/$data/$data_txt/" <<< "$l" >> "$file_temp"
done < "$file_orig"

cp "$file_temp" "$file_orig"
rm "$file_temp"
exit
Salva l'Ucraina! 🇺🇦
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Cerca e trasforma data in file .txt

Messaggio da vaeVictis »

Gli script di sed passati a riga di comando possono arrivare alla lunghezza massima della riga di comando, che dipende dal sistema operativo.
Generalmente, è dell'ordine del megabyte.
Un megabyte sono 1048576 caratteri.
Una singola istruzione è lunga circa 35 caratteri.
In tutto puoi dargli circa 30k istruzioni di questo tipo (per ogni megabyte).

Per le prestazioni, stai lanciando un comando sed ogni volta che leggi una riga del file di input, anche quando nella riga letta non trovi un match per la data.
Ultima modifica di vaeVictis il sabato 26 giugno 2021, 12:35, modificato 2 volte 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
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4445
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Cerca e trasforma data in file .txt

Messaggio da UbuNuovo »

In passato avevo già provato un codice simile, e ottenevo l'errore di "troppi argomenti...", nel pomeriggio provo con un file più corposo.
Salva l'Ucraina! 🇺🇦
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Cerca e trasforma data in file .txt

Messaggio da vaeVictis »

edit:
Inoltre credo che quando non trovi il match questa istruzione:
sed "s/$data/$data_txt/"
ti dà errore, perché "$data" è una stringa nulla.
vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ echo $foo

vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ sed "s/$foo/`date --date="$foo" "+%A, %d %B %Y"`/" foo.txt
sed: espressione -e #1, carattere 0: occorre un'espressione regolare precedente
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
steff
Moderatore Globale
Moderatore Globale
Messaggi: 40301
Iscrizione: domenica 18 febbraio 2007, 19:48
Desktop: LXQt+labwc
Distribuzione: Arch; Debian; Ubuntu Server
Sesso: Maschile
Località: Toscana
Contatti:

Re: Cerca e trasforma data in file .txt

Messaggio da steff »

Uh, grazie e entrambi, non ho letto fino in fondoe subito provato il primo script di Ubunuovo - il file è stato modificato perfettamente ma stampa una marea di

Codice: Seleziona tutto

sed: espressione -e #1, carattere 0: occorre un'espressione regolare precedente
rileggo e riprovo
Hai fatto un backup oggi? Ieri?? Quando???
La Documentazione da consultare e la FAQ sul uso del forum
Sistemi: LXQt - semplice, modulare e configurabile + *ubuntu in Vbox
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Cerca e trasforma data in file .txt

Messaggio da vaeVictis »

steff ha scritto:
sabato 26 giugno 2021, 13:03
Uh, grazie e entrambi, non ho letto fino in fondoe subito provato il primo script di Ubunuovo - il file è stato modificato perfettamente ma stampa una marea di

Codice: Seleziona tutto

sed: espressione -e #1, carattere 0: occorre un'espressione regolare precedente
rileggo e riprovo
La motivazione la hai nel mio messaggio precedente.
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
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4445
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Cerca e trasforma data in file .txt

Messaggio da UbuNuovo »

L'errore si elimina facilmente, basta fare un controllo sulla variabile, si vede che ci sono righe senza data.

Ho provato ora lo script di Vae; è come ricordavo!
Ho provato a fare le sostituzioni in un file contenente una data al giorno per riga, per un periodo compreso tra il 2000 ed oggi, ottengo:
./script_vae.sh: riga 10: /usr/bin/sed: Elenco degli argomenti troppo lungo
Con date dal 2010 ad oggi (4195 date): stesso errore
Con date dal 2012 ad oggi (3465 date): stesso errore
Finalmente, con date dal 2015 ad oggi (2369 date) ha funzionato.
Ma a questo punto i dati sono una miseria e il guadagno in prestazioni conta poco; tanto vale usare un codice più lento ma affidabile.

Questo è lo script che ho usato per creare il file dati:

Codice: Seleziona tutto

#!/bin/bash

# da=00-01-01 # Elenco degli argomenti troppo lungo
# da=10-01-01 # Elenco degli argomenti troppo lungo (4195 date)
# da=12-01-01 # Elenco degli argomenti troppo lungo (3465 date)
da=15-01-01 # ok (2369 date)
a=21-06-26
while ! [[ $da > $a ]]; do
    echo " bla bla $da blabla" >> dati.txt
    da=$(date +%y-%m-%d -d "$da + 1 day")
done
Questo lo script_vae.sh

Codice: Seleziona tutto

#!/bin/bash

pathFile='./dati.txt'
elencoDate=($(egrep -o "[0-9]{2}-[0-9]{2}-[0-9]{2}" "$pathFile" | sort | uniq))
comando=''
for item in ${elencoDate[@]}
do 
	comando+="s/"$item"/"$(date --date="$item" "+%A, %d %B %Y")"/g;"
done
sed -i "$comando" "$pathFile"
edit:
Siamo abituati a usare sed ma, ho provato, la sostituzione in "pure bash" ed è più veloce. :sisi:

Ho messo la verifica della variabile della data estratta, se è vuota, scrivo la riga com'è e continuo con la riga successiva.
Poi ho sostituito il codice sed con il codice di sostituzione in "pure bash".

Codice: Seleziona tutto

#!/bin/bash

file_orig="./dati.txt"
file_temp=$(mktemp)
while read l;do
	data=$(grep -Eo '[0-9]{2}-[0-9]{2}-[0-9]{2}' <<< "$l")
	if [ -z "$data" ]; then
		echo "$l" >> "$file_temp"
		continue
	fi
	data_txt=$(date --date="$data" "+%A, %d %B %Y")
	echo ${l/$data/$data_txt} >> "$file_temp"
done < "$file_orig"

cp "$file_temp" "$file_orig"
rm "$file_temp"
exit
Salva l'Ucraina! 🇺🇦
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Cerca e trasforma data in file .txt

Messaggio da vaeVictis »

Anche l'errore del mio si elimina facilmente:

Codice: Seleziona tutto

#!/bin/bash

pathFile='./dati.txt'
maxCount=1000 #ho messo 1000, ma credo vada bene anche 2000
counter=0
elencoDate=($(egrep -o "[0-9]{2}-[0-9]{2}-[0-9]{2}" "$pathFile" | sort | uniq))
comando=''
for item in ${elencoDate[@]}
do 
	comando+="s/"$item"/"$(date --date="$item" "+%A, %d %B %Y")"/g;"
    (( counter++ ))
    if [[ $counter -gt $maxCount ]]
    then
        sed -i "$comando" "$pathFile"
        counter=0
        comando=''
    fi
done
[[ ! -z "$sedCommand" ]] && sed -i "$sedCommand" "$pathFile"
Per le perfomance:

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ rm dati.txt 
vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ ./generaFile.sh 
vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ time ./ubuNuovo.sh 

real	0m35,074s
user	0m26,071s
sys	0m10,963s
vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ rm dati.txt 
vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ ./generaFile.sh 
vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ time ./mioScript.sh 

real	0m16,462s
user	0m13,598s
sys	0m3,393s
Le differenze si vedono.
Cpu del portatile non sotto ulteriore sforzo, ma con parecchia memoria già impiegata per via di tab di PornHub Chromium aperte.

Mi è comunque venuto in mente un metodo alternativo, credo di postarlo domani.
Ultima modifica di vaeVictis il lunedì 28 giugno 2021, 1:19, modificato 2 volte 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
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4445
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Cerca e trasforma data in file .txt

Messaggio da UbuNuovo »

Qualche indizio?
(... PornHub... :lol: Non l'avevo notato.)
Salva l'Ucraina! 🇺🇦
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Cerca e trasforma data in file .txt

Messaggio da vaeVictis »

UbuNuovo ha scritto:
sabato 26 giugno 2021, 18:40
Qualche indizio?
(... PornHub... :lol: Non l'avevo notato.)
Se sed permettesse di usare il pattern estrapolato come parametro nella command substitution si risolverebbe CON UNA SOLA CHIAMATA di sed e io sarei felicissimo.

Credo però sia possibile farlo con awk.
Controllo un attimo le tab di Chromium, e vedo se si può fare.

(Comunque battute a parte sono Tab di documentazione che ho aperto studiando)
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
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Cerca e trasforma data in file .txt

Messaggio da vaeVictis »

Praticamente, un comando del tipo:

Codice: Seleziona tutto

gawk '{b = gensub(/([0-9]{2}-[0-9]{2}-[0-9]{2})/,"$(date --date=\"\\1\" \"+%A, %d %B %Y\")", "g")}; {print b}' foo.txt
Il problema è che non riesco a capire come fargli eseguire il comando.
Infatti:

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ cat foo.txt 
bla bla 19-01-12 blabla
blabla 18-01-28 bla bla
bla bla 21-04-26 blabla

bla bla 19-01-12 blabla blabla 18-01-28 bla bla
blabla 18-01-28 bla bla blabla 18-01-28 bla bla
bla bla 21-04-26 blabla bla bla 21-04-26 blabla

bla bla 19-01-12 blabla
blabla 18-01-28 bla bla bla bla 19-01-12 blabla
bla bla 21-04-26 blabla blabla 18-01-28 bla bla bla bla 19-01-12 blabla

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/Bash/ConversioneDate$ gawk '{b = gensub(/([0-9]{2}-[0-9]{2}-[0-9]{2})/,"$(date --date=\"\\1\" \"+%A, %d %B %Y\")", "g")}; {print b}' foo.txt  
bla bla $(date --date="19-01-12" "+%A, %d %B %Y") blabla
blabla $(date --date="18-01-28" "+%A, %d %B %Y") bla bla
bla bla $(date --date="21-04-26" "+%A, %d %B %Y") blabla

bla bla $(date --date="19-01-12" "+%A, %d %B %Y") blabla blabla $(date --date="18-01-28" "+%A, %d %B %Y") bla bla
blabla $(date --date="18-01-28" "+%A, %d %B %Y") bla bla blabla $(date --date="18-01-28" "+%A, %d %B %Y") bla bla
bla bla $(date --date="21-04-26" "+%A, %d %B %Y") blabla bla bla $(date --date="21-04-26" "+%A, %d %B %Y") blabla

bla bla $(date --date="19-01-12" "+%A, %d %B %Y") blabla
blabla $(date --date="18-01-28" "+%A, %d %B %Y") bla bla bla bla $(date --date="19-01-12" "+%A, %d %B %Y") blabla
bla bla $(date --date="21-04-26" "+%A, %d %B %Y") blabla blabla $(date --date="18-01-28" "+%A, %d %B %Y") bla bla bla bla $(date --date="19-01-12" "+%A, %d %B %Y") blabla
Tu hai presente come si fa, UbuNuovo?
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
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4445
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Cerca e trasforma data in file .txt

Messaggio da UbuNuovo »

Mi sto nutrendo :D ho già staccato il cervello fino a domani.
Credo che convenga uscire da awk facendo interpretare l'espansione di comando alla shell usando l'apice singolo ' prima e dopo o se serve '"..."' in modo da non impazzire con gli escape.
No, usi \1 che deve essere interpretato da awk. Domani ci penso.
Salva l'Ucraina! 🇺🇦
Avatar utente
steff
Moderatore Globale
Moderatore Globale
Messaggi: 40301
Iscrizione: domenica 18 febbraio 2007, 19:48
Desktop: LXQt+labwc
Distribuzione: Arch; Debian; Ubuntu Server
Sesso: Maschile
Località: Toscana
Contatti:

Re: Cerca e trasforma data in file .txt

Messaggio da steff »

Mi fa piacere che stimola la vostra astuzia ;)
Il file è tipo diario, sempre una data e sotto varie righe di testo, circa 5000mila righe.
Hai fatto un backup oggi? Ieri?? Quando???
La Documentazione da consultare e la FAQ sul uso del forum
Sistemi: LXQt - semplice, modulare e configurabile + *ubuntu in Vbox
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Cerca e trasforma data in file .txt

Messaggio da vaeVictis »

steff ha scritto:
sabato 26 giugno 2021, 21:17
Mi fa piacere che stimola la vostra astuzia ;)
[...]
Quando trovo queste richieste, io non ci dormo la notte se non le risolvo. È un dramma! :cry:

@UbuNuovo
Ho appena scoperto che gawk ha delle funzioni built-in per gestire le date.
Sono più semplici da usare e migliori rispetto a una chiamata esterna a date.
Se vuoi comunque vedere come risolvere il problema della command substitution, fai pure.
Però alla fine non serve.
Lo specifico ora perché non vorrei che tu ci perdessi tempo, non sapendo domani a che ora mi potrò affacciare per produrre lo script funzionante con gawk.
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 12 ospiti