Mam plik tekstowy 250 MB, wszystko w jednym wierszu.
W tym pliku chcę zastąpić a
znaki b
znakami:
sed -e "s/a/b/g" < one-line-250-mb.txt
Nie działa z:
sed: couldn't re-allocate memory
Wydaje mi się, że tego rodzaju zadanie można wykonać w jednej linii bez przydzielania dużej ilości pamięci.
Czy istnieje lepsze narzędzie do pracy lub lepszy sposób użycia sed
?
GNU sed wersja 4.2.1
Ubuntu 12.04.2 LTS
1 GB RAM
text-processing
sed
performance
large-files
out-of-memory
Nicolas Raoul
źródło
źródło
Odpowiedzi:
Tak,
tr
zamiast tego użyj :sed
zajmuje się liniami, więc ogromna linia spowoduje problemy. Oczekuję, że wewnętrzne zadeklarowanie zmiennej utrzymuje linię, a dane wejściowe przekraczają maksymalny rozmiar przydzielony tej zmiennej.tr
z drugiej strony zajmuje się postaciami i powinien być w stanie poprawnie obsługiwać dowolnie długie linie.źródło
sed -e "s/a/z/g" b.txt > c.txt
bez żadnych problemów. Korzystanie z sed (GNU sed) 4.2.2.sed
wersji, zgadnij, że zależy to od implementacji lub sprzętu.sed
.Historyczne wersje sed i awk miały problemy z pamięcią, zostały one głównie naprawione w nowszych wersjach, ale jedno z klasycznych wystąpień tego problemu bardzo mocno uderzyło Larry'ego Walla . jego odpowiedzią było napisanie nowego języka programowania - bez ograniczeń pamięci innych niż sprzęt. Nazwał to perl. twój konkretny problem można rozwiązać prościej, ale ogólną zasadą, której używam, jest to, że sed nie używa perla.
Edytuj: poproś o przykład:
lub mniejsze zużycie pamięci:
źródło
sed
. : \