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: mxspan-general
Subject: Re: [shell-script] Remover a ultima linha do arquivo
Date: Sun, 13 Apr 2008 17:28:09 -0300 (ART)

--- 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/


reply via email to

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