아래와 같이 두 개의 문자열이 있습니다.
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
열은 다음과 같습니다.
- 토큰은 s1에만 있습니다.
- 토큰은 s2에만 존재합니다.
- 둘 다 토큰입니다.
해당 옵션을 전달하여 열을 억제할 수 있습니다(예: -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