Equivalent commande sed pour numerique

a_p -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -
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 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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   Statut Modérateur Dernière intervention   4 896
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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   Statut Modérateur Dernière intervention   4 896 > lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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   Statut Modérateur Dernière intervention   4 896
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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   Statut Modérateur Dernière intervention   4 896
 
Oups j'avions zapé ce détail ;-[
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Moi j'avais plutôt compris qu'il s'agissait de valeurs hexadécimales...
0