
아래와 같이 두 개의 문자열이 있습니다.
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' ' '
설명
두 파일을 다른 파일로 병합하고 쉼표를 구분 기호로 사용하여 토큰을 분할합니다. 그 후에는 고유한 값만 인쇄합니다. 즉, 찾고 있는 값이라고 생각되는 한 번 발생하는 값만 인쇄합니다.
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