
Ich habe zwei Zeichenfolgen wie unten:
token1, token2, token3, token4, token5, token6, token8, token9, token10
token2, token7, token4, token3, token5, token6, token8, token10, token9
Optisch kann ich erkennen, dass „Token“ wie token1
und token7
nicht in beiden Zeichenfolgen vorhanden sind. Gibt es jedoch eine einfache Möglichkeit, die unterschiedlichen Token mithilfe von Unix-Tools zu erhalten?
Der lange Weg wäre, ein Skript zu schreiben und eine Hashmap von {Token => Anzahl} zu verwalten und am Ende nur die Schlüssel auszudrucken, bei denen Anzahl = 1 ist. Aber ich nehme an, es gibt einen kürzeren Weg.
Antwort1
GNUly:
s1='token1, token2, token3, token4, token5, token6, token8, token9, token10'
s2='token2, token7, token4, token3, token5, token6, token8, token10, token9'
comm <(grep -oE '\w+' <<< "$s1" | sort) <(grep -oE '\w+' <<< "$s2" | sort)
Gibt:
token1
token10
token2
token3
token4
token5
token6
token7
token8
token9
Die Spalten sind:
- Token nur in S1
- Token nur in S2
- Token in beiden.
Sie unterdrücken eine Spalte, indem Sie die entsprechende Option übergeben (z. B. -3
zum Unterdrücken der 3. Spalte).
Antwort2
Die Grundidee von Ramesh klauen
Mit GNU awk
inbash
awk -v RS='[[:space:]]*,[[:space:]]*' '{x[$0]++}; END{for (y in x) if (x[y] == 1) print y}'
<(printf "%s" 'token1, token2, token3, token4, token5, token6, token8, token9, token10')
<(printf "%s" 'token2, token7, token4, token3, token5, token6, token8, token10, token9')
token1
token7
Antwort3
Sie können etwas wie das Folgende tun.
cat input1 input2 >> output
arr=$(cat output | tr "," "\n")
echo "${arr[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '
Erläuterung
Ich füge die beiden Dateien in einer anderen Datei zusammen und trenne die Token mit Kommas als Trennzeichen. Danach drucke ich nur die Werte aus, die eindeutig sind (also nur die Werte, die einmal vorkommen, und ich glaube, das ist es, wonach Sie suchen).
Inhalt der Datei input1
token1, token2, token3, token4, token5, token6, token8, token9, token10
Inhalt der Datei input2
token2, token7, token4, token3, token5, token6, token8, token10, token9
Nachdem ich das obige Skript ausgeführt habe, erhalte ich die folgende Ausgabe:
token1 token10 token2 token3 token4 token5 token6 token7 token8 token9
Wenn Sie die obige Ausgabe beobachten, werden nur die eindeutigen Werte aus beiden Dateien gedruckt.
Wenn Sie jedoch nur den Unterschied benötigen, können Sie den folgenden Befehl verwenden.
echo ${arr[@]} | sort | uniq -c