tr//
在bash中,我如何获得declare -a array1=( 1 2 3 4 5 6 7 8 9 10 11 12 )
declare -a array2=( 1 2 3 5 6 7 9 10 11 12 )
中存在但在array1
中不存在的值的第三个数组?在上面的示例中,预期输出为array2
答案 0 :(得分:1)
使用mapfile
,comm
,sort
和流程替换:
array1=( 1 2 3 4 5 6 7 8 9 10 11 12 )
array2=( 1 2 3 5 6 7 9 10 11 12 )
mapfile -t arr < <(comm -23 --nocheck-order \
<(printf "%s\n" "${array1[@]}" | sort -n) \
<(printf "%s\n" "${array2[@]}" | sort -n))
结果:
$ declare -p arr
declare -a arr='([0]="4" [1]="8")'
解释,由内而外:
每行打印一个元素并排序:
$ printf "%s\n" "${array1[@]}" | sort -n
1
2
3
4
5
6
7
8
9
10
11
12
和array2
相同。
将这些管道包装成流程替换并将其用作comm
的参数:
comm -23 --nocheck-order \
<(printf "%s\n" "${array1[@]}" | sort -n) \
<(printf "%s\n" "${array2[@]}" | sort -n)
-23
将结果减少为第一个数组唯一的值; --nocheck-order
禁止输入未按字典顺序排序的警告。输出是
4
8
使用mapfile
(-t
删除换行符)将每行读入数组元素:
mapfile -t arr < <(comm -23 --nocheck-order \
<(printf "%s\n" "${array1[@]}" | sort -n) \
<(printf "%s\n" "${array2[@]}" | sort -n))
现在,arr
包含两个值,如上所示。
sort
步骤并非严格要求,但也使解决方案适用于非排序数组。
答案 1 :(得分:1)
以下在线游戏可以解决问题:
image_name
diff -y <(printf '%s\n' "${array2[@]}") <(printf '%s\n' "${array1[@]}") | grep -Po '[\|\<\>][\t]\K[0-9]+$'
用于在单独的行中打印元素。现在printf
给出了输出:
diff -y
现在,您必须在1 1
2 2
3 3
5 | 4
6 5
7 6
9 7
10 | 8
11 9
12 10
11
12
之后(或有时|
或<
)过滤数字。我为此使用了>
,但也可以使用grep
。如果您的数组未排序,只需向每个sed
添加排序,如下所示:
printf