요즈음 나오는 현대적인 스크립트언어는 리스트를 기본요소를 제공하며
리스트의 Union, Intersection, Difference 오퍼레이션을 기본으로 제공하고 있다.


debootstrap이라는 데비안 distribution을 만들어 주는 툴을 사용하다가 리스트의 difference를
구하는 재미있는 로직이 있어 여기에 소개한다.


'A리스트와 B리스트의 차'는 A리스트에 있는 요소 중에 B리스트에 없는 요소들의 리스트이다.
여기 A리스트가 'a b d b c'에 대해 다음과 같은 bash 파이프명령을 수행해 보자

bash_list_diff_1.png


위의 tr은 반칸을 줄바꿈으로 바꾸어서 1줄당 한요소씩 들어가가끔 하고 있다.
sort는 말그대로 각줄에 대해 사전적정렬을 하는 것이고, uniq는 중복된 (여러줄)을 한 줄로 처리한다.

B리스트를 다음과 같이 정의하고 위와 비슷한 파이프명령를 수행해 보면 다음과 같다.

bash_list_diff_2.png


위의 두 결과를 이어서 sort하면 다음과 같다.

bash_list_diff_4.png
리스트중에 중복되지 않은 줄만 출력해 주는uniq명령의 옵션(-u)이 있다. 위의 결과에 'uniq -u'를 적용하면
다음과 같이 A리스트에서 B리스트에 있는 요소를 제외시켜 준다.

bash_list_diff_5.png


하지만 B리스트에만 있는 요소('e')가 살아 있다. 이것을 없애기 위해서 다음과 같이 했다.

bash_list_diff_6.png

간결한 표현이라고 말할 수 있다.