1

我正在尝试编写一个脚本:

a) 读取 .csv 文件的内容

b) 将变量设置为第一个位置(即逗号左侧)的值

c) 将变量值与数组中的每个位置进行比较。如果该值在数组中,则执行一个命令,如果不是,则将该值插入到数组中的第一个可用槽中。

.csv 文件格式为:

co:7077,he17208am3200816internet.pdf,he17208am3200917internet.pdf co:7077,he17208am3200817internet.pdf,he17208am3200918internet.pdf co:7077,he17208am3200818internet.pdf,he17208am3200919internet.pdf co:7077,he17208am3200819internet.pdf,he17208am3200915internet.pdf co:7162,tra210051internet. pdf,tra21005101internet.pdf co:7162,tra210051appinternet.pdf,tra21005102internet.pdf co:7178,tra4157l11201021internet.pdf,tra4158l11201021internet.pdf co:7178,tra4157l11201022internet.pdf,tra4158l21

到目前为止,我的脚本如下所示:

#!/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[@]}

当脚本被执行时,pid 会随着 while 循环的每次迭代成功设置和重置,但显然嵌套的 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如果您不需要该行的其余部分(如果需要,您可以做一些不同的事情)。这样做,您将不需要echoand awk

于 2011-02-14T16:18:33.940 回答
0

你为什么使用双方括号?而且你在if中使用了一个单一的equals而不是double?

试试这些单行...

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

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