我正在尝试编写一个脚本:
a)读取.csv文件的内容
b)将变量设置为第一个位置(即逗号左侧)的值
c)将变量值与数组中的每个位置进行比较。如果值在数组中执行一个命令,如果不是,则将该值插入数组中的第一个可用插槽。
.csv文件的格式为:
CO:7077,he17208am3200816internet.pdf,he17208am3200917internet.pdf 联合:7077,he17208am3200817internet.pdf,he17208am3200918internet.pdf 联合:7077,he17208am3200818internet.pdf,he17208am3200919internet.pdf 联合:7077,he17208am3200819internet.pdf,he17208am3200915internet.pdf 联合:7162,tra210051internet.pdf,tra21005101internet.pdf 联合:7162,tra210051appinternet.pdf,tra21005102internet.pdf 联合:7178,tra4157l11201021internet.pdf,tra4158l11201021internet.pdf 共: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[@]}
执行脚本时,pid成功设置并在while循环的每次迭代时重置,但显然嵌套的for循环从不运行。
从我的谷歌开始,我怀疑它与pid系列中的管道有关,但如果我能弄明白如何使其工作,我将受到质疑。
非常感谢任何帮助。
答案 0 :(得分:2)
您没有填充数组。永远不会执行for循环,因为数组是空的。
答案 1 :(得分:0)
为什么使用双方括号?而且你在if?
中使用了单个等于而不是双倍试试这些单行......
$ if [ "a" == "b" ] ; then echo hello ; fi
$ if [ "a" == "a" ] ; then echo hello ; fi
答案 2 :(得分:0)
在else
子句中设置一个标志,而不是在那里添加数组元素。在for
循环后,如果设置了标志,则添加数组元素。不要忘记取消标志。
您可以在没有下一行的情况下array[anum++]
或(( anum++ ))
而不是anum=$(($anum + 1))
。
另外:while IFS=, read -r pid discard
如果你不需要剩下的那一行(如果你需要,可以稍微改变一下)。这样做,您将不需要echo
和awk
。