두 목록에있는 내용을 나열하는 간단한 스크립트를 작성하려고합니다. 단순화하기 위해 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”사용법.