Mit mapfile
, comm
, sort
und Prozess Substitution:
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))
Ergebnis:
$ declare -p arr
declare -a arr='([0]="4" [1]="8")'
Erläuterung, von innen nach außen:
Pr int das Array ein Element pro Zeile und sort:
$ printf "%s\n" "${array1[@]}" | sort -n
1
2
3
4
5
6
7
8
9
10
11
12
und das gleiche für array2
.
diese Rohre in der Prozess Substitutionen Wickel und sie als Argument für comm
:
comm -23 --nocheck-order \
<(printf "%s\n" "${array1[@]}" | sort -n) \
<(printf "%s\n" "${array2[@]}" | sort -n)
Die -23
das Ergebnis zu Werten eindeutig die ersten Anordnung reduziert; --nocheck-order
unterdrückt eine Warnung, dass die Eingabe nicht lexikographisch sortiert ist. Der Ausgang dieser ist
4
8
jede Zeile in einem Array-Element lesen mit mapfile
(-t
entfernt die Zeilenumbrüche):
mapfile -t arr < <(comm -23 --nocheck-order \
<(printf "%s\n" "${array1[@]}" | sort -n) \
<(printf "%s\n" "${array2[@]}" | sort -n))
Nun arr
die beiden Werte, wie oben gezeigt enthält.
Der sort
Schritt ist nicht unbedingt erforderlich, aber macht die Lösung Arbeit für nicht sortiert und Arrays.
@andlrc. Vielen Dank. Ich verstehe nicht ganz, was eine Befehlsersetzung ist (wird aber die Frage untersuchen). Ich habe die erste geändert, um ein Array korrekt zu definieren. –
@ Remi.b Irgendwelche Gründe, warum Sie das tun? Dies ist nicht wirklich, was Shell-Skripting ist. Natürlich ist es möglich, aber haben Sie ein bestimmtes Ziel vor Augen? – andlrc