Bash에서 두 목록의 교차
두 목록에있는 내용을 나열하는 간단한 스크립트를 작성하려고합니다. 단순화하기 위해 ls를 예로 들어 봅시다. "1"과 "2"가 디렉토리라고 상상해보십시오.
하나 =`하나 하나` 둘 =`ls 둘` 교차로 $ 1 $ 2
나는 여전히 bash에서 상당히 녹색이므로, 내가하는 일을 자유롭게 수정하십시오. "1"과 "2"의 모든 파일을 출력하는 명령이 필요합니다. 둘 다 존재해야합니다. 이것을 "1"과 "2"사이의 "교차"라고 부를 수 있습니다.
comm -12 <(ls 1) <(ls 2)
솔루션 comm
comm
훌륭하지만 실제로 정렬 된 목록으로 작업해야합니다. 그리고 다행히도 여기서 우리 ls
는 ls
Bash 맨 페이지 에서 어떤 것을 사용 합니다
-cftuSUX 또는 --sort가 없으면 알파벳순으로 항목을 정렬합니다.
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}
다음 comm
명령을 사용하십시오 .
ls one | sort > /tmp/one_list
ls two | sort > /tmp/two_list
comm -12 /tmp/one_list /tmp/two_list
"정렬"은 실제로 필요하지 않지만 만일을 대비하여 항상 "comm"을 사용하기 전에 포함합니다.
덜 효율적인 (comm보다) 대안 :
cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d
입력과 원하는 출력에 따라 조인이 또 다른 좋은 옵션입니다.
join -j1 -a1 <(ls 1) <(ls 2)
또 다른 Stackoverflow 질문 "bash의 배열 교차"가 중복으로 표시됩니다. 내 의견으로는 그 질문은 두 개의 bash 배열을 비교하는 것에 대해 이야기하지만이 질문은 bash 파일에 중점을두기 때문에 상당히 동일하지 않습니다. 현재 종료 된 다른 질문에 대한 한 줄 답변은 다음과 같습니다.
# List1=( 0 1 2 3 4 6 7 8 9 10 11 12)
# List2=( 1 2 3 5 6 8 9 11 )
# List3=($(comm -12 <(echo ${List1[*]}| tr " " "\n"| sort) <(echo ${List2[*]} | tr " " "\n"| sort)| sort -g))
# echo ${List3[*]}
1 2 3 6 8 9 11
comm 유틸리티는 영숫자 정렬을 수행하는 반면 "bash의 배열 교차"는 숫자를 사용합니다. 따라서 "정렬"및 "정렬 -g"사용법.
참고 URL : https://stackoverflow.com/questions/2696055/intersection-of-two-lists-in-bash
'development' 카테고리의 다른 글
단일 셀이 아닌 테이블 셀의 열에서 줄 바꿈을 방지하는 방법은 무엇입니까? (0) | 2020.06.11 |
---|---|
moment.js에서 RFC2822 날짜를 변환하려고 할 때“사용 중단 경고 : 모멘트 생성이 js 날짜로 되돌아 감 (0) | 2020.06.11 |
모양 xml의 테두리 (0) | 2020.06.11 |
pymongo로 mongodb를 정렬하는 방법 (0) | 2020.06.11 |
편집기 창을 최대화하려면 어떻게합니까? (0) | 2020.06.11 |