Unix 도구를 사용하여 두 문자열의 토큰 차이를 찾는 방법은 무엇입니까?

Unix 도구를 사용하여 두 문자열의 토큰 차이를 찾는 방법은 무엇입니까?

아래와 같이 두 개의 문자열이 있습니다.

token1, token2, token3, token4, token5, token6, token8, token9, token10

token2, token7, token4, token3, token5, token6, token8, token10, token9

시각적으로 "토큰"이 두 문자열 모두에 존재 token1하고 존재하지 않는다는 것을 알 수 있습니다 . token7하지만 Unix 도구를 사용하여 다양한 토큰을 얻는 쉬운 방법이 있습니까?

긴 경로는 스크립트를 작성하고 {token => count}의 해시맵을 유지하고 결국 count = 1인 키만 인쇄하는 것입니다. 하지만 더 짧은 방법이 있다고 가정합니다.

답변1

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)

다음을 제공합니다:

token1
                token10
                token2
                token3
                token4
                token5
                token6
        token7
                token8
                token9

열은 다음과 같습니다.

  1. s1에만 있는 토큰
  2. s2에만 있는 토큰
  3. 둘 다에 토큰이 있습니다.

해당 옵션을 전달하여 열을 억제합니다(예 -3: 세 번째 열 억제).

답변2

Ramesh의 기본 아이디어를 꼬집음

GNU를 사용 awk하여bash

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

답변3

아래와 같이 할 수 있습니다.

cat input1 input2 >> output
arr=$(cat output | tr "," "\n")
echo "${arr[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '

설명

두 파일을 다른 파일로 병합하고 쉼표를 구분 기호로 사용하여 토큰을 분할합니다. 그 후에는 고유한 값만 인쇄합니다. 즉, 찾고 있는 값이라고 생각되는 한 번 발생하는 값만 인쇄합니다.

input1 파일 내용

token1, token2, token3, token4, token5, token6, token8, token9, token10

input2 파일 내용

token2, token7, token4, token3, token5, token6, token8, token10, token9

위의 스크립트를 실행한 후 다음과 같은 결과를 얻습니다.

token1 token10 token2 token3 token4 token5 token6 token7 token8 token9

위 출력을 관찰하면 두 파일의 고유 값만 인쇄됩니다.

그러나 차이점만 필요한 경우 아래 명령을 사용할 수 있습니다.

echo ${arr[@]} | sort | uniq -c

관련 정보