Que tal assim!!!
$ sed "`wc -l arq2.xml|awk '{print $1}'`d" arq2.xml > /tmp/a && mv 
/tmp/a arq2.xml

Gerei o arq1.xml somente para comparação com diff.
$ sed "`wc -l arq2.xml|awk '{print $1}'`d" arq2.xml > /tmp/a && mv 
/tmp/a arq1.xml
$ diff arq1.xml arq2.xml
29a30
 >  ..ID_DOCUMENTO:27

-------- Mensagem original --------
Assunto:        Re: [shell-script] Remover a ultima linha do arquivo
Data:   Sun, 13 Apr 2008 17:28:09 -0300 (ART)
De:     <[EMAIL PROTECTED]>
Responder a:    [email protected]
Para:   [email protected]




--- zoreuga <[EMAIL PROTECTED] 
<mailto:eduardo.queiroz%40gmail.com>> 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/ <http://br.mail.yahoo.com/>



Responder a