[Bash] Troncare o estrarre parte di file

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
rinosan_76
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1374
Iscrizione: sabato 18 marzo 2006, 13:41

[Bash] Troncare o estrarre parte di file

Messaggio da rinosan_76 »

Salve a tutti, ho un file di testo molto grande (>200MB) che con editor non riesco neanche ad aprire ma con nano si. Di questo file mi interessa ovviamente una porzione limitata, diciamo da una frase o serie di caratteri in giù.
Esiste un modo per dire copia quello che viene dopo su un altro file? Ovviamente da command line?
Grazie
Rino
Ultima modifica di Janvitus il mercoledì 20 ottobre 2021, 19:29, modificato 1 volta in totale.
Motivazione: Titolo più ideoneo.
La fantasía, abandonada de la razón, produce monstruos imposibles; unida con ella es madre de las artes y origen de las maravillas.      [Francisco Goya]
http://www.mangioebevo.it
rinosan_76
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1374
Iscrizione: sabato 18 marzo 2006, 13:41

Re: [COMMAND LINE] Troncare o estrarre parte di file

Messaggio da rinosan_76 »

Andrebbe bene anche qualcosa tipo dalla riga X alla riga Y o al fondo... ho appena imparato a visualizzare il numero di linea :D
La fantasía, abandonada de la razón, produce monstruos imposibles; unida con ella es madre de las artes y origen de las maravillas.      [Francisco Goya]
http://www.mangioebevo.it
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1620
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [COMMAND LINE] Troncare o estrarre parte di file

Messaggio da nuzzopippo »

Potresti provare con i comandi head e tail, esempio :

supposto un file di testo del primo canto dell'inferno di Dante, sia il file "inferno_canto1"

Codice: Seleziona tutto

LA DIVINA COMMEDIA
di Dante Alighieri





INFERNO




Inferno · Canto I


Nel mezzo del cammin di nostra vita
mi ritrovai per una selva oscura,
ché la diritta via era smarrita.

Ahi quanto a dir qual era è cosa dura
esta selva selvaggia e aspra e forte
che nel pensier rinova la paura!

Tant’ è amara che poco è più morte;
ma per trattar del ben ch’i’ vi trovai,
dirò de l’altre cose ch’i’ v’ho scorte.

Io non so ben ridir com’ i’ v’intrai,
tant’ era pien di sonno a quel punto
che la verace via abbandonai.

Ma poi ch’i’ fui al piè d’un colle giunto,
là dove terminava quella valle
che m’avea di paura il cor compunto,

guardai in alto e vidi le sue spalle
vestite già de’ raggi del pianeta
che mena dritto altrui per ogne calle.

Allor fu la paura un poco queta,
che nel lago del cor m’era durata
la notte ch’i’ passai con tanta pieta.

E come quei che con lena affannata,
uscito fuor del pelago a la riva,
si volge a l’acqua perigliosa e guata,
...
voglio estrarre il famoso paragrafo "Nel mezzo del ...", sono tre righe, l'ultima è la diciottesima, allora :

Codice: Seleziona tutto

NzP:~$ head -18 inferno_canto1 | tail -3 > extract
NzP:~$ cat extract
Nel mezzo del cammin di nostra vita
mi ritrovai per una selva oscura,
ché la diritta via era smarrita.
NzP:~$
Potresti provare un po' con metodi del genere
Fatti non foste a viver come bruti ...
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [COMMAND LINE] Troncare o estrarre parte di file

Messaggio da vaeVictis »

Per questo genere di operazioni è preferibile usare un singolo comando sed invece di una serie di comandi messi in pipe:

Codice: Seleziona tutto

$ sed -n '16,18p' prova.txt 
Nel mezzo del cammin di nostra vita
mi ritrovai per una selva oscura,
ché la diritta via era smarrita.
Ciò detto, @rinosan_76, fai una ricerca prima di aprire discussioni. Internet è pieno zeppo di soluzioni a problematiche di questo genere.
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.»
rinosan_76
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1374
Iscrizione: sabato 18 marzo 2006, 13:41

Re: [COMMAND LINE] Troncare o estrarre parte di file

Messaggio da rinosan_76 »

Ovviamente ringrazio ed ovviamente avevo cercato, ma avevo trovato roba diversa che non mi soddisfaceva. Provo i vostri 2 metodi.
Grazie
La fantasía, abandonada de la razón, produce monstruos imposibles; unida con ella es madre de las artes y origen de las maravillas.      [Francisco Goya]
http://www.mangioebevo.it
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [COMMAND LINE] Troncare o estrarre parte di file

Messaggio da vaeVictis »

Soprattutto se il file testuale è molto grande, evita di andare a leggerlo più volte, con comandi messi in pipe per estrarre un range di righe, e usa sed.

Il comando sed supporta l'estrazione di più range di righe, nel senso che puoi fare una cosa del genere:

Codice: Seleziona tutto

sed -n 'n1,n2p;n3,n4p;n5,n6p'
in cui:

Codice: Seleziona tutto

n1 = numero di riga dove inizia il primo range da estrarre
n2 = numero di riga dove finsce il primo range da estrarre
n3 = numero di riga dove inizia il secondo range da estrarre
n4 = numero di riga dove finisce il secondo range da estrarre
n5 = numero di riga dove inizia il terzo range da estrarre
n6 = numero di riga dove finisce il terzo range da estrarre
... e via dicendo.
Da notare la p finale di ogni istruzione.

Sempre nell'ottica della manipolazione di un file testuale molto voluminoso, sed permette di interrompere la lettura del file a una determinata riga.
Se per esempio vuoi stampare da riga 8 a 35, da riga 90 a 120, e da riga 500 a 600, puoi lanciare un comando come visto sopra, con l'aggiunta dell'istruzione per interrompere la lettura dal momento che a sed non serve leggere il contenuto successivo alla 600esima riga:

Codice: Seleziona tutto

sed -n '8,35p;90,120p;500,600p;601q' path_del_file_da_leggere
L'istruzione per l'interruzione della lettura è la parte finale:

Codice: Seleziona tutto

601q
rinosan_76 ha scritto:
lunedì 18 ottobre 2021, 22:05
Di questo file mi interessa ovviamente una porzione limitata, diciamo da una frase o serie di caratteri in giù.
Con variazioni sul tema, puoi estrearre il contenuto da una specifica riga fino alla fine del file, operazione che mi sembra tu sia interessato a fare.
L'ultima riga di un file è indicata con il carattere del dollaro.
Quindi un comando del tipo:

Codice: Seleziona tutto

sed -n 'numeroRigaIniziale,$p' path_del_file_da_leggere
Puoi anche estrarre il contenuto a partire da una riga che soddisfi qualche criterio di ricerca, con un comando del tipo:

Codice: Seleziona tutto

sed -n '/match/,$p' path_del_file_da_leggere
in cui al posto di "match" vai a mettere l'espressione regolare che ti interessa.
Facendo riferimento al testo proposto da @nuzzopippo, se vuoi stampare le righe a partire dalla prima che iniza con "Allor" e fino alla fine del file, puoi dare un comando del tipo:

Codice: Seleziona tutto

$ sed -n '/^Allor/,$p' inferno1.txt 
Allor fu la paura un poco queta,
che nel lago del cor m’era durata
la notte ch’i’ passai con tanta pieta.

E come quei che con lena affannata,
uscito fuor del pelago a la riva,
si volge a l’acqua perigliosa e guata,
...
Infine, puoi estrarre il contenuto a partire da una riga che soddisfi qualche criterio di ricerca e fino a una riga che soddisfi qualche altro criterio di ricerca, con un comando del tipo:

Codice: Seleziona tutto

sed -n '/match1/,${p;/match2/q}' path_del_file_da_leggere
Sempre facendo riferimento al testo di @nuzzopippo, se vuoi estrarre il testo a partire dalla prima riga che inizia con "Allor" e fino alla prima riga successiva che inizia con "la notte", puoi dare il comando:

Codice: Seleziona tutto

$ sed -n '/^Allor/,${p;/^la notte/q}' inferno1.txt 
Allor fu la paura un poco queta,
che nel lago del cor m’era durata
la notte ch’i’ passai con tanta pieta.


L'output di un comando lo redirigi in un file di output nel seguente modo

Codice: Seleziona tutto

comando > path_del_file_di_output
oppure

Codice: Seleziona tutto

comando >> path_del_file_di_output
Nel primo modo, se il file non esiste, te lo crea e ci mette l'output. Se il file esiste, te lo sovrascrive.
Nel secondo modo, se il file non esiste, te lo crea e ci mette l'output. Se il file esiste, ti appende l'output.
Affinché ti venga creato il file di output, ovviamente, devi fornire un percorso valido, nel senso che le directory intermedie per arrivare fino al file devono esistere, in quanto quelle non te le crea.
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.»
maresama
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1639
Iscrizione: mercoledì 9 gennaio 2008, 16:00

Re: [Bash] Troncare o estrarre parte di file

Messaggio da maresama »

ho visto che se faccio:
sed -n '/qui/,$p' '/... file
viene letto il file dalla prima riga che contiene la parola 'qui' fino a fine file
se faccio:
sed -n '/^qui/,$p' '/... file
viene letto il file dalla prima riga che contiene come prima parola 'qui' fino a fine file
se la parola 'qui' è preceduta da spazi la trova ugualmente

- ma esiste la possibilità di dire: da colonna 1 (quindi se spazi non va bene) ?
- dove sono indicati questi simboli speciali? (es: '^')

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] Troncare o estrarre parte di file

Messaggio da vaeVictis »

@maresama
Due osservazioni.
Usa il tag per il codice e una sintassi corretta. Non si capisce niente altrimenti.
Ti conviene inoltre aprire una discussione apposita (ho segnalato alla moderazione il tuo messaggio per farlo scorporare).

Detto ciò,
se la parola 'qui' è preceduta da spazi la trova ugualmente
dipende che intendi. Nel primo comando sì, nel secondo comando no.

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~$ echo "qui bla bla bla" | sed -n '/^qui/,$p'
qui bla bla bla
vaevictis@vaevictis-N56VV:~$ echo "    qui bla bla bla" | sed -n '/^qui/,$p'
ma esiste la possibilità di dire: da colonna 1 (quindi se spazi non va bene) ?
Come sopra, dipende che intendi.
dove sono indicati questi simboli speciali? (es: '^')
Gli indicatori come ^ nell'ambito delle espressioni regolari si chiamano "ancore". O anchors in inglese.
Se cerchi su Google trovi svariato materiale a riguardo.
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 6 ospiti