Как использовать cat для строчных больших файлов в bash?

Я использую следующую команду для строчных букв всех символов в текстовом файле.

CORPUSLOWER=$(cat foobar.txt | tr '[:upper:]' '[:lower:]')
echo $CORPUSLOWER > foobar.txt

Проблема, однако, в том, что foobar.txt имеет размер около 20 гигабайт и заменяет только небольшой фрагмент файла foobar.txt.

Мой вопрос: как я могу использовать bash для преобразования большого файла в нижний регистр?


person Bob van Luijt    schedule 26.11.2018    source источник
comment
Возможно, используя только tr '[: upper:]' '[: lower:]' ‹foobar.txt› newfile.txt, используйте меньше памяти   -  person Incrivel Monstro Verde    schedule 26.11.2018
comment
(Бесполезное использование слова cat.)   -  person Biffen    schedule 26.11.2018
comment
Кроме того, бесполезное использование захвата переменных. Попытка прочитать весь файл в переменной оболочки только для того, чтобы вы могли echo вывести его на стандартный вывод, довольно бессмысленна, поскольку сам tr уже способен выводить свой результат на стандартный вывод (и не более того).   -  person tripleee    schedule 27.11.2018


Ответы (2)


Это должно быть возможно

tr '[:upper:]' '[:lower:]' < foobar.txt | dd of=foobar.txt conv=notrunc

Или (что может быть чище) используйте временный файл

person ensc    schedule 26.11.2018

Предполагая, что у вас есть sponge от moreutils, вы можете:

tr '[:upper:]' '[:lower:]' < foobar.txt | sponge foobar.txt

sponge "впитывает" все содержимое и открывает файл только тогда, когда видит конец файла.

person L3viathan    schedule 26.11.2018
comment
Если у вас его нет, tail -n 10000000000 в целом работает хорошо, хотя файл корпуса может быть огромным. Это всего лишь 1 строка? - person Gem Taylor; 26.11.2018
comment
Джеп, это полезно, спасибо - person Bob van Luijt; 26.11.2018