Wie findet man mit Unix-Tools den Unterschied zwischen den Tokens in zwei Zeichenfolgen?

Wie findet man mit Unix-Tools den Unterschied zwischen den Tokens in zwei Zeichenfolgen?

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 token1und token7nicht 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:

  1. Token nur in S1
  2. Token nur in S2
  3. Token in beiden.

Sie unterdrücken eine Spalte, indem Sie die entsprechende Option übergeben (z. B. -3zum Unterdrücken der 3. Spalte).

Antwort2

Die Grundidee von Ramesh klauen

Mit GNU awkinbash

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

verwandte Informationen