0

ファイルから重複を取り除こうとしています。内容は数字と名前であり、名前は次のようになります(たとえば、重複した名前):ABC ABCxxyy ABC123 ABClmnなど(したがって、ここではファイルにABCのみが必要です)。これを取得するために、次のコードを記述しました。現在、ファイルの読み取り/書き込みを使用しています。配列を使用してこのコードを変更したいのですが、理解できません。

現在のコードは次のとおりです。

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
4

1 に答える 1

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

インデックスのフィールドの最初の文字の長さ$m$jがそのフィールドと同じである場合は、次のよう$mに削除されます。

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

最後に、残りの値が出力ファイルに書き込まれます。

for name in "${names[@]}"; do
  echo $name
done > name.list.new
于 2013-03-27T15:22:09.407 に答える