2014-02-26 167 views
1

这一个工作:搜索重复的元素阵列

arr[0]="XX1 1" 
arr[1]="XX2 2" 
arr[2]="XX3 3" 
arr[3]="XX4 4" 
arr[4]="XX5 5" 
arr[5]="XX1 1" 
arr[6]="XX7 7" 
arr[7]="XX8 8" 

duplicate() { printf '%s\n' "${arr[@]}" | sort -cu |& awk -F: '{ print $5 }'; } 

duplicate_match=$(duplicate) 

echo "array: ${arr[@]}" 

# echo "duplicate: $duplicate_match" 

[[ ! $duplicate_match ]] || { echo "Found duplicate:$duplicate_match"; exit 0; } 

echo "no duplicate" 

具有相同的代码,这个是不行的,为什么呢?

arr[0]="XX" 
arr[1]="wXyz" 
arr[2]="ABC" 
arr[3]="XX" 

注:我开始的bash,因为时间不长

+0

你的代码实际上并不工作,因为'sort -cu'在输入未被排序时失败;它在第一个数据集中找到的副本恰好是排序顺序中出现的第一个项目。 – chepner

+0

pipe-andpersand组合只在c-shell中有效,不在bash中 – thom

+0

@chepner谢谢,我将搜索如何在正确的位置对我的数组进行排序。 – user3353499

回答

3

要检查重复的代码更简单,在这两种情况下的工作原理:

uniqueNum=$(printf '%s\n' "${arr[@]}"|awk '!($0 in seen){seen[$0];c++} END {print c}') 

((uniqueNum != ${#arr[@]})) && echo "Found duplicates" 

编辑:要打印重复使用此awk:

printf '%s\n' "${arr[@]}"|awk '!($0 in seen){seen[$0];next} 1' 

awk命令存储在一个数组seen如果一行不是seen数组的一部分并且接下来移动到下一行。最后打印1仅打印那些重复的行。

+0

感谢Anubhava,我需要研究你的代码来完全理解它,我怎样才能返回与它的重复的重复元素呢?也有人可以纠正我的代码吗?我在这上面,因为两个小时,并完成使用另一个代码,而不理解我是令人沮丧的:( – user3353499

+0

请参阅chepner的答案下面为什么你的代码失败,如果你想了解它 – anubhava

+0

我也加了一些解释给我的答案 – anubhava