programing

바시에서 두 목록의 교차점

telebox 2023. 4. 27. 22:08
반응형

바시에서 두 목록의 교차점

저는 두 개의 목록에 있는 내용을 나열하는 간단한 스크립트를 작성하려고 합니다.단순화하기 위해 els를 예로 들어 보겠습니다."하나"와 "둘"이 디렉토리라고 상상해 보십시오.

one=''ls one''two=''ls 2''교차로 1달러 2달러

저는 아직 바시에서 꽤 미숙합니다. 그러니 제가 어떻게 하고 있는지 자유롭게 수정하세요.모든 파일을 "하나"와 "둘"로 출력하는 명령어가 필요합니다.둘 다 존재해야 합니다.당신은 이것을 "하나"와 "둘" 사이의 "교차점"이라고 부를 수 있습니다.

comm -12  <(ls 1) <(ls 2)
를 사용한 솔루션

comm훌륭하지만 실제로 정렬된 목록과 함께 작동해야 합니다.그리고 다행히도 여기서 우리는ls다음은 GNU Coreutils 문서에서 확인할 수 있습니다.

기본적으로 출력은 유효한 로케일 설정에 따라 알파벳 순으로 정렬됩니다.

comm -12  <(ls one) <(ls two)
대체 기능:sort

두 리스트의 교차점:

sort <(ls one) <(ls two) | uniq -d

두 리스트의 대칭 차이:

sort <(ls one) <(ls two) | uniq -u
보너스

가지고 놀기 ;)

cd $(mktemp -d) && mkdir {one,two} && touch {one,two}/file_{1,2}{0..9} && touch two/file_3{0..9}

다음 명령을 사용합니다.

ls one | sort > /tmp/one_list
ls two | sort > /tmp/two_list
comm -12 /tmp/one_list /tmp/two_list

"sort"는 별로 필요하지 않지만, 만약을 위해 "comm"을 사용하기 전에 항상 포함합니다.

효율성이 낮은(Common보다) 대안:

cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d

조인은 입력 및 원하는 출력에 따라 또 다른 좋은 옵션입니다.

join -j1 -a1 <(ls 1) <(ls 2)

언급URL : https://stackoverflow.com/questions/2696055/intersection-of-two-lists-in-bash

반응형