Estou tentando remover o primeiro e o último caracteres de todas as linhas em um arquivo de texto e salvar a versão truncada resultante em um novo arquivo. Alguém tem uma idéia sobre como fazer isso de forma eficiente usando awk
ou outros programas / comandos linux especificamente para arquivos grandes?
input.txt
(s,2,4,5,6)
"s,1,5,5,2"
{z,0,4,5,3}
[y,2,4,5,5]
(y,4,4,5,7)
(r,20,4,5,7)
(e,9,4,5,2)
Output.txt esperado
s,2,4,5,6
s,1,5,5,2
z,0,4,5,3
y,2,4,5,5
y,4,4,5,79
r,20,4,5,7
e,9,4,5,2
text-processing
sed
awk
pacodelumberg
fonte
fonte
ssed
ou o baú da ferramenta Heirloomsed
pode obter melhor desempenho.sed
Conforme sua pergunta, apague a última e a primeira palavra do arquivo de entrada, conforme abaixo:
fonte
s/.\(.*\).$/\1/
,. Pode ser mais rápido por não usar referências anteriores, e a pergunta mencionou "arquivos grandes".time yes | head -n 10000000 | COMMAND >/dev/null
. Eu receborev input | cut -c2- | rev | cut -c2-
→ 0.14s,sed 's,.\(.*\).$,\1,'
→ 3.38s;awk '{print substr($0,2,length()-2);}'
→ 3.50s;sed 's/.$//; s/^.//'
→ 5.09s.sed 's/.\(.*\)./\1/'
parece ser mais rápido quesed 's/^.\(.*\).$/\1/'
(GNU sed novamente). Além disso, o desempenho depende da localidade (interpretação do que é um personagem) e dased
implementação (nesse sentido, sed do baú da ferramenta da herança é consideravelmente mais rápido que o GNU sed).Existem muitas possibilidades, como sempre
Explicação
,
- o delimitador sed, também pode ser qualquer outro caractere, pois é escapado onde quer que seja necessário..
Corresponder a um único caractere\(.*\)
- Agrupe a parte restante e ela será armazenada para recuperação posterior..
Corresponder um único caractere novamente$
- Fim da linha\1
- gera o texto correspondente ao grupo acimag
substituir globalmente na linha.fonte
g
? haverá apenas uma correspondência por linha.Você também pode fazer isso
awk
se preferirfonte
Isso deve funcionar também. É bem "traduzir" cada um dos caracteres para nada (excluir).
A desvantagem é que eles serão excluídos se eles também não forem o primeiro / último caractere. Também perderá os caracteres finais que você não listar no
()[...
.fonte