Equivalent commande sed pour numerique

Fermé
a_p - 16 janv. 2009 à 17:42
mamiemando Messages postés 33410 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 2 décembre 2024 - 17 janv. 2009 à 01:34
Bonjour,

J'ai un fichier sous UNIX qui contient des valeurs numeriques en colonne 4 à 6 :

ABC010
BCD020
CDE041
DEF049

Je cherche une ligne de commande, un peu sur le modèle de sed, qui permettrait d'ajouter 1 (par exemple) à mes valeurs ce qui donnerait sur le fichier exemple :

ABC011
BCD021
CDE042
DEF050

Quelqu'un a-t'il une idée?

Merci d'avance
A voir également:

7 réponses

mamiemando Messages postés 33410 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 2 décembre 2024 7 808
16 janv. 2009 à 18:25
Je te propose une solution avec ce petit programme en C. Copie colle ceci dans un fichier appelé plop.c :
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char **argv){
    FILE *fin,*fout;
    int x;
    int ret;
    if(argc != 3){
        fprintf(stderr,"usage: %s filename_in filename_out\n",argv[0]);
        return 1;
    }
    if(!(fin = fopen(argv[1],"r"))){
        fprintf(stderr,"can't read %s\n",argv[1]);
        return 2;
    }
    if(!(fout = fopen(argv[2],"w"))){
        fclose(fin);
        fprintf(stderr,"can't write %s\n",argv[2]);
        return 3;
    }
    while((ret = fscanf(fin,"%x\n",&x)) != EOF){
        if (ret == 1) fprintf(fout,"%x\n",x+1);
        else{
            fprintf(stderr,"%s invalid file\n",argv[1]);
            break;
        }
    }
    fclose(fout);
    fclose(fin);
    return 0;
}
Ensuite compile le en tapant :
gcc -W -Wall -o convertir plop.c

Puis lance le programme (en supposant que plop.txt soit le fichier d'entrée et plop2.txt le fichier après addition) :
./convertir plop.txt plop2.txt

Exemple : plop.txt :
1111
A12E
2222

donnera après conversion :
(mando@aldur) (~) $ ./convertir plop.txt plop2.txt
1112
a12f
2223

Si tu préfères des caractères hexadécimaux en majuscules change dans le programme C que je t'ai donné les %x par des %X, recompile le programme avec gcc, et relance-le.

Bonne chance
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
16 janv. 2009 à 18:41
Salut,

Perso j'avais ça :
[tmpfs]$ cat fich
ABC010
BCD020
CDE041
DEF049

[tmpfs]$ awk 'n=match($0,/[0-9][0-9]/) { print substr($0,1,(n-1))(substr($0,n,(RLENGTH+1))+1) }' fich
ABC11
BCD21
CDE42
DEF50

[tmpfs]$
Qui marche bien, à part que ça me sucre les "0" (zéros) ;-(((

Si quelqu'un a une idée (n'est-ce pas dubcek) ;-))
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 569
16 janv. 2009 à 18:53
Salut,
$ awk 'n=match($0,/[0-9][0-9]$/) { print substr($0,1,(n-1))(substr($0,n,(RLENGTH+1))+1) }' zz
ABC011
BCD021
CDE042
DEF050

0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
16 janv. 2009 à 18:56
Merchi lami20j. J'attendais aussi ta solution en PERL, qui je n'en doutais pas serait 10 fois plus simple et courte ;-))
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 569
16 janv. 2009 à 18:51
Salut,

lami20j@debian:~/trash$ cat zz
ABC010
BCD020
CDE041
DEF049
lami20j@debian:~/trash$ perl -ne 's/(\d{2})$/$1+1/e;print' zz
ABC011
BCD021
CDE042
DEF050

0
mamiemando Messages postés 33410 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 2 décembre 2024 7 808
16 janv. 2009 à 19:02
Sans vouloir être chauvine je crois que je préfère le C, c'est toujours aussi incompréhensible pour moi le perl ^^
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 569
16 janv. 2009 à 19:52
Re,

Une autre version
lami20j@debian:~/trash$ cat zz
ABC010
BCD020
CDE041
DEF049
lami20j@debian:~/trash$ for i in $(cat zz);do echo ${i:0:4}$((${i:4:2} + 1));done
ABC011
BCD021
CDE042
DEF050

0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
16 janv. 2009 à 20:00
Clap clap clap.

Ben disons que là faut être sûr de la longueur de la chaîne avant quand même ;-))
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 569
16 janv. 2009 à 20:12
Re,

qui contient des valeurs numeriques en colonne 4 à 6
(Clap clap clap. ){1,} ;-))

$ cat zz
ABC010AAA
BCD020BBB
CDE041CCC
DEF049DDD
$ for i in $(cat zz);do echo ${i:0:4}$((${i:4:2} + 1))${i:6};done
ABC011AAA
BCD021BBB
CDE042CCC
DEF050DDD

0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
16 janv. 2009 à 20:13
Oups j'avions zapé ce détail ;-[
0
mamiemando Messages postés 33410 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 2 décembre 2024 7 808
17 janv. 2009 à 01:34
Moi j'avais plutôt compris qu'il s'agissait de valeurs hexadécimales...
0