Arrays 搜索重复元素数组

Arrays 搜索重复元素数组,arrays,bash,duplicates,Arrays,Bash,Duplicates,这项工作: 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 "a

这项工作:

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"

要检查重复项,此代码要简单得多,并且在两种情况下都有效:

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'

如果一行不是
seen
数组的一部分,那么Awk命令将存储在数组
seen
中,并将下一行移动到下一行<代码>1最后只打印那些重复的行。

这里的解决方案有点傻。我只是想看看我是否可以在没有显式管道的情况下在单个命令中完成这项工作。(我认为对于非常大的数组/数组元素,)

请注意,这是对是否存在重复数组元素的测试,并且不会输出重复的数组元素本身,尽管
awk
命令本身会这样做。还要注意的是,如果您不幸拥有包含空格的数组元素,下面的计算结果将不会如所述

[[ $( awk -v RS=" " ' a[$0]++ ' <<< "${arr[@]} " ) ]] && echo "dups found"

[[$(awk-v RS=“””a[$0]++'您的代码实际上不起作用,因为当输入尚未排序时,
sort-cu
会失败;它在第一个数据集中找到的重复项恰好是第一个无序出现的项。管道和符号组合仅在c-shell中有效,而在bash@chepner谢谢,我将搜索如何对数组进行排序正确的位置。@thom
|&
被添加到
bash
以及版本4中。@chepner谢谢,我已更正。管道符号确实有效。谢谢Anubhava,我需要研究你的代码才能完全理解它,我如何返回重复的元素以与之呼应?还有谁能更正我的代码吗?我从两点开始就在这方面了一个小时后,在不理解我的代码的情况下使用另一个代码是令人沮丧的:(如果你想理解的话,请参阅下面chepner的答案为什么你的代码失败。我还对我的答案做了一些解释。