1

私は次のようなスクリプトを書き込もうとしています。

a).csvファイルのコンテンツを読み取ります

b)変数を最初の位置(つまり、コンマの左側)の値に設定します

c)変数値を配列内の各位置と比較します。値が配列にある場合は1つのコマンドを実行し、そうでない場合は、その値を配列の最初の使用可能なスロットに挿入します。

.csvファイルの形式は次のとおりです。

co:7077、he17208am3200816internet.pdf、he17208am3200917internet.pdf co:7077、he17208am3200817internet.pdf、he17208am3200918internet.pdf co:7077、he17208am3200818internet.pdf、he17208am3200919internet.pdf co:7077、he17208am3200819 pdf、tra21005101internet.pdf co:7162、tra210051appinternet.pdf、tra21005102internet.pdf co:7178、tra4157l11201021internet.pdf、tra4158l11201021internet.pdf co:7178、tra4157l11201022internet.pdf、tra4158l11201022internet.pdf

これまでの私のスクリプトは次のようになります。

#!/bin/bash

declare -a array
anum=0
src=source.csv
pid=0

while read line;
do
pid=$( echo $line | awk '{print$1}' FS=",")

  for n in "${array[@]}";
     do

        if [[ "$pid" = "$n" ]] ;
         then

          echo Duplicate value: "$pid";

         else
          array[$anum]="$pid"
          anum=$(( $anum +1 ))
        fi
     done
done < $src

echo ${array[@]}

スクリプトが実行されると、whileループが繰り返されるたびにpidが正常に設定およびリセットされますが、ネストされたforループは実行されないようです。

私のグーグルから、それはpidラインのパイプと関係があるのではないかと思いますが、それを機能させる方法を理解できれば、私は悩まされるでしょう。

どんな助けでも大歓迎です。

4

3 に答える 3

2

配列にデータを入力していません。配列が空であるため、for ループは実行されません。

于 2011-02-14T16:02:48.550 に答える
0

elseそこに配列要素を追加する代わりに、句にフラグを設定します。フラグが設定されている場合はループの後forに、配列要素を追加します。フラグの設定を解除することを忘れないでください。

array[anum++]次の行なしで、または(( anum++ ))の代わりに行うことができますanum=$(($anum + 1))

またwhile IFS=, read -r pid discard、残りの行が必要ない場合(必要な場合は、少し異なる方法で行うことができます)。これを行うと、とは必要ありませechoawk

于 2011-02-14T16:18:33.940 に答える
0

なぜ二重角括弧を使用したのですか? また、if で double ではなく single equals を使用しましたか?

これらのワンライナーを試してください...

$ if [ "a" == "b" ] ; then echo hello ; fi

$ if [ "a" == "a" ] ; then echo hello ; fi
于 2011-02-14T16:04:47.010 に答える