colonne d'édition d'un fichier texte

-1

abc.txt se compose de deux données de colonne comme

1  A1021
2  A1021
3  A1022
4  A1022

Je veux un autre fichier de test, disons pqr.txt (en remplacement de A1021 par 1 et A1022 par 2 etc).

J'ai utilisé le code perl habituel suivant comme

open(IN,"abc.txt") or die;
open(OUT,">pqr.txt") or die;
While(<IN>) {
    chomp;
    $curline = $_;
    @data = split(' ',$curline);
    If($data[1] eq A1021) {$data[1] = 1;}
    If ($data[1] eq A1022) {$data[1] = 2;}
}
close(IN)
close(OUT)

Comment puis-je faire une boucle si j'ai un grand ensemble de données (disons 500) et des valeurs discontinues dans la deuxième colonne du fichier abc.txt

1  A1021
2  A1021
3  A1022
4  A1022
5  A1026
6  A1026

Je suis intéressé pour remplacer A1021 par 1, A1022 par 2 et A1026 par 3 etc. Toute autre suggestion, comme l'utilisation de awk ou de python, pourrait m'aider.

user316350
la source
Désolé, je viens juste de manquer d’ajouter les éléments suivants à la partie de codage en tant que print OUT "$ data [0] \ t $ data [1] \ n";
user316350

Réponses:

0

Si vous voulez que les sorties soient toujours incrémentées:

(A1021, A1021, A1025, A1029, A1025 = 1, 1, 2, 3, 4)

$i = 0;
$last = "";

while (<>) {
    chomp;
    @data = split;
    if ($data[1] ne $last) {
        ++$i;
        $last = $data[1];
    }
    $data[1] = $i;
    print "@data\n";
}

Si vous voulez que la même entrée ait la même sortie:

(A1021, A1021, A1025, A1029, A1025 = 1, 1, 2, 3, 2)

$i = 0;
%v = ();

while (<>) {
    chomp;
    @data = split;
    $data[1] = $v{$data[1]} //= ++$i;
    print "@data\n";
}
grawity
la source