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

Résolu/Fermé
fbgo88 Messages postés 4 Date d'inscription vendredi 16 mars 2007 Statut Membre Dernière intervention 20 mars 2007 - 16 mars 2007 à 22:11
fbgo88 Messages postés 4 Date d'inscription vendredi 16 mars 2007 Statut Membre Dernière intervention 20 mars 2007 - 20 mars 2007 à 19:36
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

jipicy Messages postés 40805 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 901
16 mars 2007 à 22:50
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 ... ;-))
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 564
17 mars 2007 à 11:17
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 :-))
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 564
17 mars 2007 à 08:00
Oups!

0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 564
17 mars 2007 à 10:26
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

0
fbgo88 Messages postés 4 Date d'inscription vendredi 16 mars 2007 Statut Membre Dernière intervention 20 mars 2007
17 mars 2007 à 12:11
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 564
17 mars 2007 à 13:41
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;
}


0
fbgo88 Messages postés 4 Date d'inscription vendredi 16 mars 2007 Statut Membre Dernière intervention 20 mars 2007
17 mars 2007 à 16:16
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
0
fbgo88 Messages postés 4 Date d'inscription vendredi 16 mars 2007 Statut Membre Dernière intervention 20 mars 2007
20 mars 2007 à 19:36
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é.
0