Comando sed di base su file di una sola riga di grandi dimensioni: impossibile riassegnare la memoria


10

Ho un file di testo da 250 MB, tutto in una riga.

In questo file voglio sostituire i acaratteri con i bcaratteri:

sed -e "s/a/b/g" < one-line-250-mb.txt

Non riesce con:

sed: couldn't re-allocate memory

Mi sembra che questo tipo di attività possa essere eseguita in linea senza allocare molta memoria.
Esiste uno strumento migliore per il lavoro o un modo migliore di utilizzare sed?


GNU sed versione 4.2.1
Ubuntu 12.04.2 LTS
1 GB RAM



4
Questa domanda riguarda un'espressione multilinea molto complessa. La mia domanda riguarda l'espressione più elementare che si possa immaginare.
Nicolas Raoul,

@RubanSavvy plus, nessuna delle risposte sull'altra Q tiene conto della linea lunga e, in effetti, entrambi avrebbero probabilmente lo stesso problema.
Terdon

Puoi includere la tua versione sed in questa Q e anche le informazioni sull'hardware (in particolare RAM) e la versione distro?
slm

Risposte:


10

Sì, utilizzare trinvece:

tr 'a' 'b' < file.txt > output.txt

sedsi occupa di linee, quindi una linea enorme può causare problemi. Mi aspetto che dichiari internamente una variabile per contenere la linea e il tuo input supera la dimensione massima assegnata a quella variabile.

tr d'altra parte si occupa di personaggi e dovrebbe essere in grado di gestire correttamente le linee arbitrariamente lunghe.


Curiosamente ho appena creato un file da 250 MB riempito con "abcabc ..." e sono stato in grado di fare a sed -e "s/a/z/g" b.txt > c.txtmeno di qualsiasi problema. Uso di sed (GNU sed) 4.2.2.
slm

@slm stesso qui su un file 496M e stessa sedversione, immagino che dipenda dall'implementazione o dall'hardware.
Terdon

Sì, se dovessi indovinare, abbiamo a che fare con una versione precedente di sed.
slm

5

Le versioni storiche di sed e awk hanno avuto problemi di memoria, queste sono state per lo più risolte in versioni più recenti, ma una delle occorrenze classiche di questo problema ha colpito abbastanza duramente Larry Wall . la sua risposta era scrivere un nuovo linguaggio di programmazione, senza limiti di memoria diversi dall'hardware. Lo chiamava perl. il tuo problema specifico può essere risolto più semplicemente, ma la regola generale che uso è quando sed non utilizzerà perl.

Modifica: su richiesta un esempio:

perl -pe "s/a/b/g" < one-line-250-mb.txt

o per un minore utilizzo della memoria:

perl -e 'BEGIN{$/=\32768}' -pe "s/a/b/g" < one-line-250-mb.txt

1
L'intero paragrafo si riduce a "Perl". Alcuni dettagli sarebbero belli, o almeno un esempio o qualcosa del genere
Michael Mrozek

@MichaelMrozek Mi rendo conto che la collezione di cappelli tende a portare al roboediting, ma ho pensato che con la tua reputazione avresti prestato maggiore attenzione. In particolare in quanto il problema specifico era già stato risolto, in modo molto ristretto, ciò non avrebbe aiutato la maggior parte delle persone a cercare, quindi ho aggiunto una risposta per il caso generale. la risposta espansa che ho fornito avrebbe aiutato Nicolas Raoul se non ci fosse già stata una soluzione praticabile, ma dubito che sarebbe di aiuto a molti altri, mentre la mia risposta originale aiuterebbe tutti coloro che hanno raggiunto i limiti di sed. Se non sei d'accordo, eliminerò
hildred il

@hildred Non credo sia troppo chiedere che tu possa presumere in buona fede i moderatori quando fanno commenti validi sulla tua risposta, senza ricorrere immediatamente alle accuse di ulteriori motivi (cappelli, davvero ?!).
Chris Down,

@ChrisDown Al contrario, ci sono dentro per i cappelli. Anche questa è stata contrassegnata come non una risposta da più persone, ma questa è una seconda distante priorità per i cappelli
Michael Mrozek

Il secondo con la limitazione della memoria ha funzionato (per il mio file da 1 riga da 2,5 GB): grazie! Un po 'deluso sed, però. : \
Tomislav Nakic-Alfirevic,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.