shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Remover a ultima linha do arquivo


From: Andre Xavier
Subject: Re: [shell-script] Remover a ultima linha do arquivo
Date: Mon, 14 Apr 2008 12:36:08 -0300

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: address@hidden 
  To: address@hidden 
  Sent: Sunday, April 13, 2008 5:28 PM
  Subject: Re: [shell-script] Remover a ultima linha do arquivo



  --- zoreuga <address@hidden> 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]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]