1

我已经为此工作了几个小时,但我似乎无法弄清楚。我正在尝试比较两个字符串数组并使用第三个数组列出奇数。这就是我所拥有的:

#! /bin/bash
arr1=( "bww" "jrr" "icp" "bbw" )
arr2=( "bww" "icp" "bbw" )

arr3=("${arr1[@]}")


for j in ${arr2[*]}; do
    for k in ${arr3[*]}; do
        if [ "${arr2[$j]}" == "${arr3[$k]}" ]; then
            arr4[$k]=1
        else
            arr4[$k]=0
        fi
    done
done

for i in ${arr3[*]};do
    if [ ${arr4[$i]} -eq 1 ]; then
        unset ${arr3[$i]}
    fi
done

echo ${arr3[*]}

我觉得我通过嵌套第二个 for 循环以及使用第四个数组使其过于复杂。当我测试这段代码时,它只是打印出 arr1 的内容。

这是我希望的输出:

jrr

任何指针都会很好,我对 Bash 很陌生,我尝试过搜索其他问题,但我似乎找不到我需要的东西。谢谢。

4

1 回答 1

3

取消sortuniq提取唯一记录:

#!/usr/bin/env bash

arr1=( "bww" "jrr" "icp" "bbw" )
arr2=( "bww" "icp" "bbw" )

# Map the null delimited -d '' stream of entries into the array arr3
# from the output of the sub-shell < <(commands) group.
mapfile -d '' arr3 < <(
  # Create a null delimited stream from the entries of both arr1 and arr2
  printf %s\\0 "${arr1[@]}" "${arr2[@]}" |
  
  # Sort the null delimited stream with -z option of sort
  sort -z |
  
  # Extract unique null delimited entries for -z and -u options of uniq
  uniq -zu
)

printf %s\\n "${arr3[@]}"

使用 Bash4+ 的关联数组计算出现次数的替代方法:

#!/usr/bin/env bash

arr1=( "bww" "jrr" "icp" "bbw" )
arr2=( "bww" "icp" "bbw" )
arr3=()

# Associative array of integers to count occurences of keys
declare -Ai key_count

# Count occurrences of key in arr1 and arr2
for key in "${arr1[@]}" "${arr2[@]}"; do
  key_count[$key]+=1
done

# For each key of key_count Assoc array
for key in "${!key_count[@]}"; do
  # If key occurs only once
  if [ ${key_count[$key]} -eq 1 ]; then
    # Add the key as entry to arr3
    arr3+=("$key")
  fi
done

printf %s\\n "${arr3[@]}"
于 2020-10-02T01:21:46.087 回答