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' ' '

설명하다

이 두 파일을 다른 파일로 병합하고 태그를 쉼표로 구분하여 구분했습니다. 그 후에는 고유한 값만 인쇄합니다(한 번만 나타나는 값을 의미하며, 이는 사용자가 찾고 있는 값이라고 생각합니다).

파일 내용 1개를 입력하세요.

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

2개의 파일 내용을 입력하세요.

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

위 스크립트를 실행한 후 내가 얻는 결과는 다음과 같습니다.

token1 token10 token2 token3 token4 token5 token6 token7 token8 token9

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

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

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

관련 정보