Extraire de donnée d'1 fichier ascii (unix)

[Résolu/Fermé]
Signaler
Messages postés
4
Date d'inscription
vendredi 16 mars 2007
Statut
Membre
Dernière intervention
20 mars 2007
-
Messages postés
4
Date d'inscription
vendredi 16 mars 2007
Statut
Membre
Dernière intervention
20 mars 2007
-
Bonjour,
sous unix, j'aimerai faire un programme pour extraire de données dans un fichier de 5 méga d'octets environ, ( en c ou par awk si possible) du genre :
extraire_donnee = moulinette (nom_du_fichier, position_debut_de_donnée, longeur_de_la_donnée).

nom_du_fichier : le nom du fichier
position_debut_de_donnée : position en octet du début de la donnée à extraire
longueur_de_la_donnée : longeur en octet de la donnée.

exemple :
donnée = (toto.txt, 450000, 80)

j'ai effectué un programme par les commandes tail et head, mais j'avoue que le traitement c'est assez long, car je dois extraire de ce fichier environ 60000 données de 80 octets, et malheureusement ce fichier n'a pas de retour chariot, c'est comme une ligne de 5000000 de caractères, et la mémoire est insufissante pour charger le fichier complet.
J ai essayé par substr sous awk, mais au bout d'un moment ça décale, on me dit que c'est un soucis de buffer...
si quelqu'un a une idée pour cette moulinette, j'avoue qu'il m'aidera beaucoup, ou existe t-il deja une commande sous unix?

Merci d'avance de votre réponse...

5 réponses

Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 888
Salut,

Essaie avec "sed" :
sed  's/^.\{450000\}\(.\{80\}\).*/\1/' toto.txt
N'ayant pas de fichier de cette taille je n'ai pu tester qu'à une moindre échelle ... ;-))
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 562
Salut JP,

N'ayant pas de fichier de cette taille je n'ai pu tester qu'à une moindre échelle ... ;-))

Tu as commencé être paresseux :-)), Oups, je voulais dire perlien :-DD

Tu peux créér vite fait ce fichier :-))
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 562
Oups!

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 562
Salut,

et avec Perl, ça ne te conviens pas?!
~$ time perl -e 'print "a" x 5000000' > fbgo88.txt

real    0m0.109s
user    0m0.016s
sys     0m0.080s
~$ cat fbgo88.txt | wc -c
5000000
~$ du -sh fbgo88.txt
4,8M    fbgo88.txt
~$ time perl -ne 'print unpack("x45000 A80",$_)' fbgo88.txt > res_fbgo88.txt

real    0m0.101s
user    0m0.056s
sys     0m0.028s
lami20j@debian:~$ cat res_fbgo88.txt | wc -c
80

Messages postés
4
Date d'inscription
vendredi 16 mars 2007
Statut
Membre
Dernière intervention
20 mars 2007

merci de vos reponses
helas j'ai une vielle becane unix (plus de 8 ans), et je n' ai pas perl dessus.
Mais je vais essayer avec la commande sed.
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 562
Salut,

helas j'ai une vielle becane unix (plus de 8 ans), et je n' ai pas perl dessus.


As-tu vérifié?
D'après ce que je lit dans le livre de Larry Wall, Perl a été conçu au depart comme langage pour administrer UNIX

whereis perl te donne quoi?
D'ailleurs les regex n'accepte pas un quantificateur plus de 32767

tu dois tricher, mais tu attends une éternité :-))

essaie avec
#include <stdio.h>

int main()
{
  FILE *fic;
  char c[81];

  fic=fopen("fbgo88.txt","rb");

  fseek(fic,450000,SEEK_CUR);
  fread(c,sizeof(char),80,fic);
  c[80]='\0';
  printf("%s",c);
  return 0;
}


Messages postés
4
Date d'inscription
vendredi 16 mars 2007
Statut
Membre
Dernière intervention
20 mars 2007

je vais essayer ta solution, elle me parait la plus simple (programme en c).
merci beaucoup.

Ce week end je suis absent,je ne pourrais faire le test que lundi.
Je te dirais si c'esi bon.
En tous cas tu m'as donné un bon coup de pouce.

fbgo88
Messages postés
4
Date d'inscription
vendredi 16 mars 2007
Statut
Membre
Dernière intervention
20 mars 2007

C'est ok, la procédure en c m'a beaucoup aidé. bien sur j'ai ajouté des trucs. je remercie tout le monde qui m'ont aidé.