2015-10-05 57 views
0

將因子向量(不是所有級別都是唯一的)轉換爲bash中的數字向量的最有效方法是什麼?只要每個數字代表唯一的因子水平,數字向量中的值就不重要。在bash中將因子轉換爲數字

爲了說明,這將是R相當於什麼我想在bash的事:

數字< -seq_along(水平(因素))[因素]

即:

因素

AV1019A
ABG1787
AV1019A
B77hhA
B77hhA

數字

非常感謝。

+2

嘗試添加一些例子來說清楚。 – anubhava

+0

「只要每個數字表示一個唯一的因子水平,數字向量中的值就不重要了」 - 散列怎麼樣?沒有bash內建的,只是呼叫你最喜歡的hasher。 '回聲AV1019A | sha1sum'或'echo AV1019A | sum'。 –

+2

在這種情況下什麼是_factor_? –

回答

2

這很可能不是最有效的,但也許開始。

#!/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 

我最初想要使用關聯數組,但它只是一個bash 4+特性,並且在這裏和那裏都不可用。如果你有bash 4,那麼你有一個文件少,這顯然更有效。

#!/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