2015-10-05 2 views
0

Quel est le moyen le plus efficace de convertir un vecteur de facteur (tous les niveaux ne sont pas uniques) en un vecteur numérique dans bash? Les valeurs du vecteur numérique n'ont pas d'importance tant que chacune représente un niveau unique du facteur.convertir le facteur en numérique dans bash

Pour illustrer, ce serait la R équivalent à ce que je veux faire dans bash:

numérique < -seq_along (niveaux (facteur)) [facteur]

Ie:

facteur

AV1019A
ABG1787
AV1019A

B77hhA B77hhA

numérique

Merci beaucoup.

+2

Essayez d'ajouter quelques exemples pour clarifier les choses. – anubhava

+0

"Les valeurs dans le vecteur numérique n'ont pas d'importance tant que chacun représente un niveau unique du facteur" - que diriez-vous d'un hachage? pas de basin intégré, mais appelez à votre hasher préféré. 'echo AV1019A | sha1sum' ou 'echo AV1019A | somme'. –

+2

Qu'est-ce qu'un _factor_ dans ce contexte ??? –

Répondre

2

Ce n'est probablement pas le plus efficace, mais peut-être quelque chose à commencer.

#!/bin/bash 

input_data=$(mktemp) 
map_file=$(mktemp) 

# your example written to a file 
echo -e "AV1019A\nABG1787\nAV1019A\nB77hhA\nB77hhA" >> $input_data 

# create a map <numeric, factor> and write to file 
idx=0 
for factor in $(cat $input_data | sort -u) 
do 
    echo $idx $factor 
    let idx=$idx+1 
done > $map_file 

# go through your file again and replace values with keys 
while read line 
do 
    key=$(cat $map_file | grep -e ".* ${line}$" | awk '{print $1}') 
    echo $key 
done < $input_data 

# cleanup 
rm -f $input_data $map_file 

Je voulais d'abord utiliser des tableaux associatifs, mais il est une fête 4+ et ne disposent ici et là. Si vous avez bash 4 alors vous avez un fichier de moins, ce qui est évidemment plus efficace.

#!/bin/bash 

# your example written to a file 
input_data=$(mktemp) 
echo -e "AV1019A\nABG1787\nAV1019A\nB77hhA\nB77hhA" >> $input_data 

# declare an array 
declare -a factor_map=($(cat $input_data | sort -u | tr "\n" " ")) 

# go through your file replace values with keys 
while read line 
do 
    echo ${factor_map[@]/$line//} | cut -d/ -f1 | wc -w | tr -d ' ' 
done < $input_data 

# cleanup 
rm -f $input_data