[Risolto] Bash: script per estrarre sub forzati da sub principali

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
Duke_Fleed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 265
Iscrizione: domenica 2 agosto 2009, 15:41
Desktop: Gnome
Distribuzione: EndeavourOS, Ubuntu 24.04.2
Sesso: Maschile

[Risolto] Bash: script per estrarre sub forzati da sub principali

Messaggio da Duke_Fleed »

Mi sono reso conto che visualizzare solo le righe con le parole in lettere maiuscole viewtopic.php?f=33&p=5368697#p5368697 non mi bastava, perché non solo dovevo fare copia e incolla di queste righe in un nuovo file, ma anche copiare i rispettivi codici temporali e cambiare i numeri progressivi, e mi sono chiesto perché non fare uno script che lo fa per me? :D

Rimando qui https://it.m.wikipedia.org/wiki/SubRip su che cosa sono i subrip, ma sostanzialmente sono formati da un numero progressivo, da codici temporali che indicano quando si visualizza un sottotitolo e quando deve scomparire, e il testo che deve essere visualizzato. Il mio script deve essere usato solo quando i sub forzati non sono in un file a parte, e serve solo a individuare ed estrarre dai sub principali i sottotitoli forzati in maiuscolo, quelle scritte tipicamente inglesi che appaiono nei film e tradotte in italiano, come ad esempio FARM -> FATTORIA, HOSPITAL -> OSPEDALE, e così via.

Posto quindi lo script estraesub.sh, sicuramente migliorabile, magari potrà servire ad altri. Lo script come mio solito quando li faccio è sempre con spiegazioni.

Codice: Seleziona tutto

#!/bin/bash

# script che estrae dai sub principali i sub forzati e li salva in un file .srt a parte
# eseguire lo script con ./estraesub.sh sub_principali.srt

# Con il ciclo while si leggono tutte le righe del file dei sub principali.
# Gli if..fi servono a controllare se le righe contengono almeno una parola in lettere maiuscole,
# e se è così li scrive nel file creato, insieme ai suoi codici temporali, e al suo nuovo numero
# progressivo di sottotitolo.
# N è la variabile del nuovo numero progressivo di ogni sottotitolo forzato estratto.
# RIGA_PRECEDENTE è la variabile che contiene la riga letta precedentemente, serve per controllare
# in seguito una volta trovata una riga con parole in lettere maiuscole, se la riga prima contiene 
# i codici temporali, quindi numerici. Prima di una riga con parole possono esserci solo i codici
# temporali o altre parole.

while IFS= read -r RIGA; do
  if [[ $RIGA =~ [[:upper:]]{2,} ]]; then
    if [[ $RIGA_PRECEDENTE =~ [[:digit:]][^a-z] ]]; then
      N=$((N+1))
      echo -e "\n$N\n$RIGA_PRECEDENTE\n$RIGA" >> sub_forzati.srt
    else
      echo "$RIGA" >> sub_forzati.srt
    fi
  fi
  RIGA_PRECEDENTE=$RIGA
done < "$1"
sed -i '1d' sub_forzati.srt  # elimina la prima riga del file

:ciao:
Ultima modifica di Duke_Fleed il martedì 16 luglio 2024, 16:14, modificato 1 volta in totale.
Guide all'emulazione di Amiga e dell'Amstrad CPC
Un semplice script per creare file .desktop da Nautilus
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 536
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu24@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: Bash: script per estrarre sub forzati da sub principali

Messaggio da Lucio C »

Non so nulla di "subrip" et similia, ma per qualsiasi forma di list processing con pattern matching posso consigliare (come tradizionale in Linux come gia' in Unix) l'uso di awk. Lunga man page, e tanti tutorial in rete ... ma gli script awk sono sicuramente piu' leggibili di qualsiasi cosa fatta in qualsiasi shell (piu' grep, sed, cut etc.).
Magari qualcuno piu' giovani di me dira' di perl lo stesso che io dico di awk. :D
The reasonable man adapts himself to the world: the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. (G.B. Shaw)
Avatar utente
Duke_Fleed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 265
Iscrizione: domenica 2 agosto 2009, 15:41
Desktop: Gnome
Distribuzione: EndeavourOS, Ubuntu 24.04.2
Sesso: Maschile

Re: Bash: script per estrarre sub forzati da sub principali

Messaggio da Duke_Fleed »

Ehhh, vuoi troppo, so poco e nulla di awk.

Comunque è uno scriptino, sono di più le linee di commento che le linee di codice :lol:
E penso che sia anche abbastanza leggibile :sisi:
Che poi ci sia un altro modo, più elegante diciamo, che arrivi allo stesso risultato non lo metto in dubbio. Ma questo funziona, e penso che sia la cosa più importante ;)
Guide all'emulazione di Amiga e dell'Amstrad CPC
Un semplice script per creare file .desktop da Nautilus
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 536
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu24@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: Bash: script per estrarre sub forzati da sub principali

Messaggio da Lucio C »

eh gia' non si leggono piu' il Pike & Kernighan o il Kernighan & Ritchie ... magari non e' nemmeno facile trovarli
The reasonable man adapts himself to the world: the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. (G.B. Shaw)
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2909
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Bash: script per estrarre sub forzati da sub principali

Messaggio da rai »

:ciao:
se invece che in pure bash si vuole fare con awk questo è un modo:

Codice: Seleziona tutto

$ awk 'BEGIN{ RS = "\n\n" ; FS = "\n"}  function f(n){return ($n=="" ? "" : $n"\n")}; /[[:upper:]]{2,}/ {N=N+1; print N "\n" $2 "\n" $3  "\n" f(4) f(5)}' esempio.srt
1
00:10:00,400 --> 00:15:15,300
CIAO

2
00:35:00,400 --> 00:35:15,300
HOTEL_SPLENDOR
12 NOVEMBRE 1955

3
00:40:00,400 --> 00:42:15,300
SOLO TU - È QUI - DI PIÙ
SÌ

4
00:43:16,400 --> 00:44:25,300
TEXAS - STATI UNITI

5
00:47:16,400 --> 00:48:25,300
È ANDATO DI LÀ
COME PUÒ ESSERE ?

6
00:52:16,400 --> 00:52:25,300
OCCUPATO
OGGI

$ 
oppure si mette lo stesso codice in un file

Codice: Seleziona tutto

BEGIN{ RS = "\n\n" ; FS = "\n"}
function f(n) {
    return ($n=="" ? "" : $n"\n")
    }
/[[:upper:]]{2,}/ {
    N=N+1
    print N "\n" $2 "\n" $3  "\n" f(4) f(5)
    }
per eseguirlo con

Codice: Seleziona tutto

awk -f estraesub.awk input.srt > forzati.srt
La differenza tra usare awk e usare cicli della shell non è questione di eleganza ma (molto) di efficienza: awk è ottimizzato per questi lavori e risulta più veloce di oltre un ordine di grandezza in questo test fatto con un file.srt di 260K righe

Codice: Seleziona tutto

$ time ./estraesub.sh /esempiolungo.srt 

real    0m4,973s
user    0m4,303s
sys     0m0,664s
$
$ time awk -f estraesub.awk esempiolungo.srt > forzati.srt

real    0m0,107s
user    0m0,107s
sys     0m0,001s
$
Detto questo, come scrivevi, la leggibilità conta (ottima cosa documentare nel file di quello che oggi pare ovvio e domani potrebbe sembrare arabo) e nel tuo caso probabilmente la differenza tra awk e bash non si noterebbe molto, a meno di film lunghissimi e pieni di dialoghi.

Comunque se fosse mio, generalizzerei il codice dello script shell per maggiore comodità: così se il file di input si chiama pippo.srt, il file di output si chiamerà pippo_forzati.srt

Codice: Seleziona tutto

#!/bin/bash

sub_forzati="${1%.*}_forzati.srt"
while IFS= read -r RIGA; do
  if [[ $RIGA =~ [[:upper:]]{2,} ]]; then
    if [[ $RIGA_PRECEDENTE =~ [[:digit:]][^a-z] ]]; then
      ((N++))
      echo -e "\n$N\n$RIGA_PRECEDENTE\n$RIGA" >> "$sub_forzati"
    else
      echo "$RIGA" >> "$sub_forzati"
    fi
  fi
  RIGA_PRECEDENTE=$RIGA
done < "$1"
sed -i 1d "$sub_forzati"  # elimina la prima riga del file

EDIT modificati per coerenza tra loro i nomi degli script
Ultima modifica di rai il sabato 13 luglio 2024, 18:04, modificato 1 volta in totale.
Avatar utente
Duke_Fleed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 265
Iscrizione: domenica 2 agosto 2009, 15:41
Desktop: Gnome
Distribuzione: EndeavourOS, Ubuntu 24.04.2
Sesso: Maschile

Re: Bash: script per estrarre sub forzati da sub principali

Messaggio da Duke_Fleed »

Buongiorno @rai, grazie per tutte queste tue spiegazioni.

A una prima occhiata non ci ho capito molto del codice riguardo awk :D dovrò rivedermelo per bene. Ti confesso però che prima che me lo dicesse Lucio C ci avevo già pensato di usare awk e volevo chiedere il tuo aiuto, ma poi siccome sono uno che vuole provarci da solo ho optato per il bash, che, seppur un po' arrugginito, lo conosco meglio. E poi non era manco difficile scrivere lo script, giusto qualche linea di codice.

Riguardo alla modifica del mio script che suggerisci, ti ringrazio, è una buona idea ma non mi cambia niente e ti spiego il perché. Una volta fatto la copia di backup del mio DVD o Bluray, e appurato che i sub forzati sono nei sub principali, estraggo questi ultimi dal film, li sottopongo ad OCR e li salvo in subrip (.srt). Non li rinomino e quindi hanno nomi generici, tipo numero_e-altro-che-non-ricordo.srt. Poi uso lo script, e una volta che ho il file sub_forzati.srt lo rinomino con lo stesso nome del film salvato, questo perché se in futuro voglio vedere il film sul media player che ho, un Asus Oplay mini che ha qualcosa come 10 anni ma funziona ancora bene, devo copiare i sub nella stessa cartella del film e con lo stesso nome altrimenti non me li carica di default.

Fortunatamente non devo sempre fare questa procedura, al 90% i forzati sono sempre in un file a parte. E poi non sempre film o episodi di serie TV li hanno.

:ciao:
Guide all'emulazione di Amiga e dell'Amstrad CPC
Un semplice script per creare file .desktop da Nautilus
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2909
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Bash: script per estrarre sub forzati da sub principali

Messaggio da rai »

A una prima occhiata non ci ho capito molto del codice riguardo awk :D dovrò rivedermelo per bene.
Segue spiegone:

Codice: Seleziona tutto

BEGIN{ RS = "\n\n" ; FS = "\n"}
function f(n) {
    return ($n=="" ? "" : $n"\n")
    }
/[[:upper:]]{2,}/ {
    N=N+1
    print N "\n" $2 "\n" $3  "\n" f(4) f(5)
    }
awk scorre dall'inizio alla fine l'input che gli si passa (per esempio un file) suddividendolo in tanti record; il separatore predefinito dei record è il carattere "\n" per cui in modo predefinito i record corrispondono alle righe dell' input.
Quando modifichiamo il separatore dei record con RS = "\n\n" awk considererà ogni blocco di sottotitolo come un record, cosa che ci serve.

All'interno di ogni record awk suddivide il testo in campi: il separatore predefinito tra campi è ogni [sequenza di] spazio o tab. Invece a noi serve dividere i blocchi di sottotitoli in righe per cui modifichiamo il separatore dei campi con FS = "\n".

Tutto ciò viene eseguito una volta sola, all'interno della sezione BEGIN.

La funzione definita nel secondo rigo, chiamata f() prende come parametro un numero: è una complicazione che ho dovuto usare per gestire i casi di sottotitoli su più righe: quando il relativo campo/rigo è vuoto non stampiamo niente, altrimenti lo stampiamo seguito dal newline.
Il resto sono i comandi eseguiti ogni volta che un record contiene il pattern indicato tra / ... /: in quel caso si incrementa di uno il contatore N che viene messo nell'output insieme alle righe interessate. Nota che ho previsto un massimo di tre righe per sottotitolo ma niente impedisce di aumentarlo.
Avatar utente
Duke_Fleed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 265
Iscrizione: domenica 2 agosto 2009, 15:41
Desktop: Gnome
Distribuzione: EndeavourOS, Ubuntu 24.04.2
Sesso: Maschile

Re: Bash: script per estrarre sub forzati da sub principali

Messaggio da Duke_Fleed »

Segue spiegone:
Grazie, ora lo capisco di più :)
Comunque è incredibile, in poche linee di codice fa tutto questo. Awk è davvero potente, ma per padroneggiarlo così dovrei studiarlo parecchio. Riguardo alle righe dei sottotitoli tre sono già molte, sono sempre al massimo due, ma va bene uguale, grazie ancora. Penso che userò il mio script se vedo che i sub sono poche righe, ma se saranno di più userò awk.

Volevo dare qualche informazione in più sui sottotitoli presenti in un DVD o Bluray. I sub (da subtitle = sottotitolo) possono essere di 4 tipi: dialoghi, dialoghi per non udenti (abbreviati in n.u.), commento (ad es. del regista, di un attore, ecc.), e forzati (scritte in lingua straniera tradotte in italiano, oppure dialoghi in lingua straniera tipo cinese, russo tradotti in italiano, o un mix dei due). I sub dei commenti e dei forzati non sono sempre presenti. I dialoghi sempre ovviamente, e ultimamente sono presenti solo quelli per non udenti.

Quando inseriamo un disco nel lettore DVD/Bluray se sono presenti i sub forzati di solito c'è un flag attivo che lo comunica al lettore per farli visualizzare. Talvolta può capitare che il flag non sia attivo, e allora bisogna attivarli manualmente dal menu del lettore. Ancora, può capitare che i sub forzati non siano in un sub a parte ma facciano parte dei sub dei dialoghi. In questo caso un flag comunica al lettore quali sono da estrapolare e visualizzare. Raramente può succedere che non ci sia nessun flag per estrapolarli, mi è capitato però qualche mese fa con un DVD restaurato, parti non doppiate ma con sottotitoli in italiano, e per poterlo vedere ho dovuto vedere il film con i sub dei dialoghi attivi! E' chiaramente un errore, presumo di authoring.

Sul PC usando VLC si può vedere chiaramente come per default quali sub si attivino. A proposito di VLC ci tengo a dire una cosa e riguarda la wiki sui Bluray. Non è così semplice, almeno su Linux, su Windows non so, vedere i Bluray. Infatti sempre o quasi questi hanno i menu in java, e nonostante io abbia java installato i menu non li vedo, e una volta caricato un bluray VLC si chiude. L'unico modo per vedere un bluray con i menu in java è andare nel menu di VLC e scegliere 'no menu'. Facendo così VLC "salta" il menu e carica direttamente il film. Però con un bluray di serie tv è un po' più complicato...
Naturalmente tutto questo non vale per i Bluray che hanno menu statici, e per i DVD.

Spulciando sul web sembra che per vedere i menu in java bisogna installare la v8 o giù di lì, non ricordo. Io non ci ho provato, a me interessa solo fare il backup dei miei Bluray e non guardarli sul Pc.

:ciao:
Guide all'emulazione di Amiga e dell'Amstrad CPC
Un semplice script per creare file .desktop da Nautilus
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 536
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu24@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: Bash: script per estrarre sub forzati da sub principali

Messaggio da Lucio C »

Duke_Fleed ha scritto:
domenica 14 luglio 2024, 10:47
Comunque è incredibile, in poche linee di codice fa tutto questo. Awk è davvero potente, ma per padroneggiarlo così dovrei studiarlo parecchio.
Per me vale senz'altro la pena (magari perlisti o pythoniti potrebbero dissentire). Cercare in rete un buon awk tutorial, p.es. https://www.gnu.org/software/gawk/manual/gawk.html.

Secondo me awk e' ideale per gestire files con blocchi di record con pattern simili (io lo uso p.es. per convertire pagine html in input per un database mysql (o vv), per processare mail generati da form, e molti altri casi, inclusi alcuni che processano l'output di comandi. E' un linguaggio vero e proprio con una sua sintassi piuttosto comprensibile. Quello a cui bisogna fare l'abitudine e' che si aspetta di processare dei record di input in sequenza, in base a pattern (incluse regular expressions). Ogni statement elementare e' dato da una clausola o patterm e una azione (tra {}). Le clausole BEGIN e END sono speciali ... spesso se si usano piu' pattern per poi concatenare l'output e' necessario nicordarsi di outputtarte l'iultima occorrenza in END.
Nelle clausole-pattern $0 e' l'intero record e $1, $2 fino a $NF sono i campi,

rai ha fatto una cosa molto furba giocando su RS e FS e doppia newline per gestire blocchi di record,. Io di solito uso "getline" per avanzare alle righe successive entro l'azione di una clausola evitando che le processi come indipendenti. E uso la funzione split per separare dei campi in sottocampi con separatori aternativi.

Long live awk !
The reasonable man adapts himself to the world: the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. (G.B. Shaw)
Avatar utente
Duke_Fleed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 265
Iscrizione: domenica 2 agosto 2009, 15:41
Desktop: Gnome
Distribuzione: EndeavourOS, Ubuntu 24.04.2
Sesso: Maschile

Re: Bash: script per estrarre sub forzati da sub principali

Messaggio da Duke_Fleed »

Ti ringrazio, ma ora non ho proprio tempo. E comunque se l'avessi vorrei fare un ripasso di Python, sono molto arrugginito, non lo uso dal 2020 più o meno, vorrei anche rifare il mio script con esso. Senza offesa, ma tra studiare awk e ripassare Python preferirei fare quest'ultima cosa :D

:ciao:
Guide all'emulazione di Amiga e dell'Amstrad CPC
Un semplice script per creare file .desktop da Nautilus
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2909
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Bash: script per estrarre sub forzati da sub principali

Messaggio da rai »

Senza offesa, ma tra studiare awk e ripassare Python preferirei fare quest'ultima cosa :D
Effettivamente con python, quasi senza ottimizzazione e con grande semplicità, si ottiene una performance sovrapponibile a quella di awk

Codice: Seleziona tutto

#!/usr/bin/env python3
import re
import sys
regex = re.compile("[A-ZÀÈÉÌÒÙ]{2,}", flags=re.M)
with open(sys.argv[1], "r") as f:
    subts = f.read().split("\n\n")
N = 0
for subt in subts:
    if regex.search(subt):
        N += 1
        print(N)
        for line in subt.splitlines()[1:]:
            print(line)
        print()

Codice: Seleziona tutto

$ time ./subrip.py esempiolungo.srt > forzati.py.srt

real    0m0,134s
user    0m0,125s
sys     0m0,009s
$
$ time awk -f subrip.awk esempiolungo.srt > forzati.srt

real    0m0,112s
user    0m0,102s
sys     0m0,004s
$
Questo è uno dei motivi del successo di Python: la sua duttilità lo rende un coltellino svizzero adatto a ogni sorta di compiti e con efficienza
Avatar utente
Duke_Fleed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 265
Iscrizione: domenica 2 agosto 2009, 15:41
Desktop: Gnome
Distribuzione: EndeavourOS, Ubuntu 24.04.2
Sesso: Maschile

Re: Bash: script per estrarre sub forzati da sub principali

Messaggio da Duke_Fleed »

Ciao @rai, non sapevo fossi anche esperto di Python. Moooolto più in là il programma avrei voluto scriverlo io dopo il ripasso, naturalmente dato i miei limiti (anche dovuto al fatto che sono un autodidatta) non credo che sarebbe assomigliato al tuo codice. Ti ringrazio perché mi hai risparmiato la fatica :D ma certamente quando potrò lo scriverò anche io.

Vado un attimo OT per aggiungere che Python mi ha insegnato a scrivere codice in modo leggibile, grazie anche alla sua indentazione. Se penso ai programmi in Basic che scrivevo negli anni '90 c'è un abisso. L'indentazione la uso anche in Bash, come si evince dal mio script postato. Mi aiuta anche a trovare subito un blocco che mi interessa, nello script la struttura condizionale if..else..fi.
Invece il documentare il codice l'ho sempre fatto fin dall'inizio, prima di tutto per me altrimenti dopo tempo non capirei niente e l'hai detto anche tu, e dopo per chi leggerà il mio codice.
Guide all'emulazione di Amiga e dell'Amstrad CPC
Un semplice script per creare file .desktop da Nautilus
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2132
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: Bash: script per estrarre sub forzati da sub principali

Messaggio da korda »

rai ha scritto:
lunedì 15 luglio 2024, 22:11
Senza offesa, ma tra studiare awk e ripassare Python preferirei fare quest'ultima cosa :D
Effettivamente con python, quasi senza ottimizzazione e con grande semplicità, si ottiene una performance sovrapponibile a quella di awk
[...]
Questo è uno dei motivi del successo di Python: la sua duttilità lo rende un coltellino svizzero adatto a ogni sorta di compiti e con efficienza
:love: :love: :love:

Purtroppo c'è sempre l'irriducibile zoccolo duro del "si è sempre fatto così" che non si riuscirà mai a convincere, nemmeno con l'evidenza :muro:

Edit: giusto per rimanere offtopic, si parlava di una comparsata di ubuntu.it al PyCon... poi personalmente non ne ho più saputo nulla
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
Avatar utente
tokijin
Moderatore Globale
Moderatore Globale
Messaggi: 4648
Iscrizione: mercoledì 3 giugno 2009, 23:10
Desktop: plasma 5.27.4
Distribuzione: Kubuntu 23.04
Località: Abruzzo

Re: Bash: script per estrarre sub forzati da sub principali

Messaggio da tokijin »

Siamo in sezione tecnica: gli off topic non andrebbero fatti, non andrebbero alimentati e non andrebbero fatti neanche gli Edit per rimanerci.
Rimaniamo in tema per favore.

@Duke_Fleed mi pare che il problema sia risolto; se ho capito bene modifica pure il titolo del primo messaggio inserendo il prefisso [Risolto].

Ciao :ciao:
Sei abbruzzese se dopo che ti sei strafogato un chilogrammo di pasta, hai il coraggio di dire alla cuoca "cacc ch'è cott" - Se entra un piccione in casa..chiudi le finestre!
Ubuntu User #28657 - Il mio vecchio hardware - Tag Codice
Avatar utente
Duke_Fleed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 265
Iscrizione: domenica 2 agosto 2009, 15:41
Desktop: Gnome
Distribuzione: EndeavourOS, Ubuntu 24.04.2
Sesso: Maschile

Re: Bash: script per estrarre sub forzati da sub principali

Messaggio da Duke_Fleed »

Chiedo scusa per l'off topic. Comunque quando ho aperto il thread non era una richiesta di aiuto per un problema ma avevo fatto uno script e volevo condividerlo. Poi rai gentilmente mi ha fatto vedere e spiegato che con awk e Python si otteneva lo stesso risultato ma in modo più efficiente e lo ringrazio ancora per questo. Ho messo [Risolto] come richiesto.

:ciao:
Guide all'emulazione di Amiga e dell'Amstrad CPC
Un semplice script per creare file .desktop da Nautilus
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2909
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: [Risolto] Bash: script per estrarre sub forzati da sub principali

Messaggio da rai »

Duke_Fleed ha scritto:
martedì 16 luglio 2024, 13:01
Ciao @rai, non sapevo fossi anche esperto di Python. Moooolto più in là il programma avrei voluto scriverlo io dopo il ripasso, naturalmente dato i miei limiti (anche dovuto al fatto che sono un autodidatta) non credo che sarebbe assomigliato al tuo codice. Ti ringrazio perché mi hai risparmiato la fatica :D ma certamente quando potrò lo scriverò anche io.
Non esageriamo, esperto di Python certamente non sono. Devo ancora fare un sacco di errori per rientrare in quella cerchia definita da N.Bohr :-D
E comunque, anch'io sono autodidatta (mi definisco `orecchiante') con l'aggravante che quando ho cominciato avevo già i capelli grigi...

BTW mi era venuto in mente che sulla lentezza dello script sh incidesse il fatto che le stringhe sono scritte singolarmente, riga per riga, nel file di output causando un overhead di IO.
Ma in realtà, modificando lo script per fare un unico reindirizzamento finale nella riga di comando, il miglioramento è solo marginale:

Codice: Seleziona tutto

$ time ./estraesub.sh /esempiolungo.srt > forzati.srt

real    0m4,635s
user    0m3,998s
sys     0m0,632s
$
quindi la maggiore lentezza è proprio insita nell'implementazione dei cicli nella shell
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 10 ospiti