[bash] Bash에서 두 목록의 교차

두 목록에있는 내용을 나열하는 간단한 스크립트를 작성하려고합니다. 단순화하기 위해 ls를 예로 들어 봅시다. “1”과 “2”가 디렉토리라고 상상해보십시오.

하나 =`하나 하나`
둘 =`ls 둘`
교차로 $ 1 $ 2

나는 여전히 bash에서 상당히 녹색이므로, 내가하는 일을 자유롭게 수정하십시오. “1”과 “2”의 모든 파일을 출력하는 명령이 필요합니다. 둘 다 존재해야합니다. 이것을 “1”과 “2”사이의 “교차”라고 부를 수 있습니다.



답변

comm -12  <(ls 1) <(ls 2)


답변

솔루션 comm

comm훌륭하지만 실제로 정렬 된 목록으로 작업해야합니다. 그리고 다행히도 여기서 우리 lslsBash 맨 페이지 에서 어떤 것을 사용 합니다

-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”사용법.


답변