To jedno dzieło:
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 "%sn" "${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"
z tym samym kodem, ten nie działa, dlaczego?
arr[0]="XX"
arr[1]="wXyz"
arr[2]="ABC"
arr[3]="XX"
uwaga: zaczynam bash od bardzo dawna
Odpowiedzi:
3 dla odpowiedzi № 1Aby sprawdzić duplikaty, ten kod jest znacznie prostszy i działa w obu przypadkach:
uniqueNum=$(printf "%sn" "${arr[@]}"|awk "!($0 in seen){seen[$0];c++} END {print c}")
(( uniqueNum != ${#arr[@]} )) && echo "Found duplicates"
EDYTOWAĆ: Aby wydrukować duplikaty, użyj tego awk:
printf "%sn" "${arr[@]}"|awk "!($0 in seen){seen[$0];next} 1"
Polecenie awk przechowuje w tablicy seen
jeśli linia nie jest już częścią seen
array i następnie przejdź do następnej linii. 1
na końcu drukuje tylko te linie, które są duplikatami.