Você pode usar tr
:
LC_ALL=C tr -d '[:blank:]\n' < file_in > file_out
Desde quando você precisa trabalhar com arquivos de 10k, uma solução melhor seria:
find . -type f -exec perl -i.bak -pe 's/ |\t|\n//g' {} +
Digamos que eu tenha uma pasta com arquivos de texto de 10K. Eu gostaria de remover todo espaço, TAB e linebreak de cada arquivo.
Como posso fazer isso com eficiência?
Você pode usar o GNU sed
:
$ shopt -s dotglob # includes "hidden" files beginning with .
$ sed -i.bak ':a;N;$!ba;s/[\n \t]//g' *
Isso processará todos os arquivos na pasta. Ele armazena um backup do arquivo original com extensão .bak
. Basta usar -i
sem .bak
, se você não quiser backups.
Para fazer isso, use isso de forma alternativa:
sed -i.bak ':a;N;$!ba;s/[\n \t]//g' $(find . -type f)
Do ponto de velocidade de manipulação do conteúdo do arquivo, eu diria que tr
é mais rápido que uma solução de expressão regular em perl
, sed
ou similar.
Quanto ao loop de mais de dez mil arquivos, não há muito o que fazer, pois tr
processará stdin
to stdout
, então você está gerando tr
10k vezes do jeito que você faz. Para isso, find . -maxdepth -exec
é um bom caminho para qualquer um.