Vc tentou com "sed -i" ? Nunca manipulei um arquivo tão grande com sed, mas vc poderia tentar:
No meu caso, fiz um teste com um arquivo pequeno, 1,69M, e rodando em cygwin. $ ls -ltra | grep teste -rw-r--r-- 1 qax001 mkgroup-l-d 1692726 Apr 14 12:25 teste $ time sed -i '$d' teste real 0m1.419s user 0m0.343s sys 0m0.843s ----- Original Message ----- From: [EMAIL PROTECTED] To: [email protected] Sent: Sunday, April 13, 2008 5:28 PM Subject: Re: [shell-script] Remover a ultima linha do arquivo --- zoreuga <[EMAIL PROTECTED]> escreveu: > Olá Pessoal, > > Tenho uma partição com 90 GB de espaço total onde > consta um > arquivo .txt de 70 GB preciso remover a ultima linha > deste arquivo sem > gerar um novo, já que não tenho espaço suficiente? > > Com a expressão abaixo removeria a linha mas teria > que gerar um novo > arquivo! > > cat arquivo.txt | sed '450000d' > novo_arquivo.txt > > 70 GB + > 70GB = 140GB > > Alguém sabe como posso fazer? > > Não sei se já resolveu..., e como as mensagens que vi de resposta acho que não resolveram o problema, tive uma idéia que talvez resolva o problema, está certo não é shell, mas talvez esta aí seja a única solução. Não tenho tanta certeza de que não vai ser criado um arquivo temporário, mas acho que não vai. Não está muito bem feito, só aproveite a oportunidade para treinar a minha programação em C. $ gcc -o dellines dellines.c Se o seu arquivo possui um '\n' no final da última linha, o que você quer provavelmente é deletar duas linhas. $ dellines arq.txt 2 se não tem o '\n' no final $ dellines arq.txt 1 Não esqueça de dizer se funcionou... -------------- #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ FILE *FH; char lastChar; int pos = 0; int nLines = 0; int linesToDelete = 0; if(argc != 3){ printf("usage %s <filename> <number of lines to delete>\n", argv[0]); exit(1); } linesToDelete = atoi(argv[2]); if((FH = fopen(argv[1], "rb+")) != NULL){ fseek(FH, 0, SEEK_END); while(fseek(FH, -1 * sizeof(char), SEEK_CUR) == 0){ lastChar = fgetc(FH); fseek(FH, -1 * sizeof(char), SEEK_CUR); if(lastChar == '\n'){ nLines++; if(linesToDelete == nLines){ break; } } } pos = ftell(FH); fclose(FH); if(pos != 0){ printf("deletando %d lines; mantendo %d bytes\n", nLines, pos); truncate(argv[1], pos * sizeof(char)); } }else{ perror("Falha ao abrir arquivo para escrita"); exit(2); } return 0; } Abra sua conta no Yahoo! Mail, o único sem limite de espaço para armazenamento! http://br.mail.yahoo.com/ [As partes desta mensagem que não continham texto foram removidas]
