2013-03-27 104 views
0

我試圖從文件中除去重複項。內容是數字和名字,名字可以是(例如重複的名字):ABC ABCxxyy ABC123 ABClmn等等...(所以在這裏我只想在我的文件中使用ABC)。爲了得到這個,我寫了下面的代碼。目前它使用文件讀/寫。我想要使​​用數組來更改此代碼,但無法計算。從bash數組中刪除重複項並保存到文件

下面是當前的代碼:

for h in `cat name.list` 
do 
count=`grep -c $h name.list` 
if (($count >= 1)) 
then 
    echo $h >> name.list.new   #building the new list 
    grep -v $h name.list > name.list.tmpcopy #rebuilding the name.list file... 
    mv name.list.tmpcopy name.list 
fi 
done 

我試過,但我得到了相同的原始清單作爲輸出:

while read line 
do 
    array+=("$line") 
done < name.list 

#loop thru the array:... 
for ((i=0; i < ${#array[*]}; i++)) 
do 
    h=${array[i]} 
    match=$(echo "${array[@]:0}" | tr " " "\n" | grep -c $h) 
    if (($match >= 1)) 
    then 
     # remove all matched names from array..... Longest match from front of string(s) 
     array=${array[@]##$h} 

     #save the current name to new array 
     array3[${#array3[*]}]=$h 
    fi 
done 

for ELEMENT in "${array3[@]}" 
do 
echo $ELEMENT 
done > name.list.new 

回答

2

試試這個:

declare -a names=($(<name.list)) 

len=${#names[@]} 

for i in $(seq 0 $len); do 
    if [ "${names[$i]}" != "" ]; then 
    m=${names[$i]} 
    for j in $(seq 0 $len); do 
     if [ $i -ne $j ]; then 
     if [ "$m" == "${names[$j]:0:${#m}}" ]; then 
      unset names[$j] 
     fi 
     fi 
    done 
    fi 
done 

for name in "${names[@]}"; do 
    echo $name 
done > name.list.new 

步驟 - 一步:

代碼首先聲明一個陣列

declare -a names=(...) 

並讀取的name.list的內容到它:

$(<name.list) 

然後,它遍歷該陣列的所有索引:

for i in $(seq 0 $len); do 
    ... 
done 

作爲安全警衛空場被跳過:

if [ "${names[$i]}" != "" ]; then 
    ... 
    fi 

非空字段被讀入$m(爲方便起見)可變

m=${names[$i]} 

然後內部循環迭代除了當前在外環($i)處理的索引陣列的所有索引:

for j in $(seq 0 $len); do 
     if [ $i -ne $j ]; then 
     ... 
     fi 
    done 

如果字段中的索引$j第一長度OF- $m字符是相同$m該字段是REM Oved的:

 if [ "$m" == "${names[$j]:0:${#m}}" ]; then 
      unset names[$j] 
     fi 

最後剩下的值寫入到輸出文件:

for name in "${names[@]}"; do 
    echo $name 
done > name.list.new 
+0

謝謝。完美的作品,你可以一步一步解釋嗎?這樣我可以在未來的解決方案中使用該學習? thx再次! – rajeev 2013-03-27 15:43:59

+0

@rajeev查看更新的答案。 – 2013-03-27 17:52:14