유닉스 계열의 컴퓨터 운영 시스템에 있는 comm 명령은 공통 행과 별개 행에 대해 두 파일을 비교하기 위해 사용되는 유틸리티입니다. comm은 POSIX 표준에 지정되어 있습니다. 그것은 1980년대 중반부터 후반까지 유닉스-계열 운영 시스템에서 널리 사용할 수 있었습니다.
History
Lee E. McMahon에 의해 작성된, comm는 버전 4 유닉스에 처음 등장했습니다.
GNU coreutils에 번들된 comm 버전은 Richard Stallman과 David MacKenzie에 의해 작성되었습니다.
Usage
comm는 텍스트 줄로 여겨지는 두 개의 파일을 입력으로 읽습니다. comm은 3개의 열을 포함하는 하나의 파일을 출력합니다. 처음 두 열은 각각 첫 번째 파일과 두 번째 파일에 고유한 줄을 포함합니다. 마지막 열은 둘 다에 공통적인 줄을 포함합니다. 이 기능성은 diff와 유사합니다.
열은 전형적으로 <tab> 문자로 구분됩니다. 만약 입력 파일이 구분 기호 문자로 시작하는 줄을 포함하면, 출력 열이 모호해질 수 있습니다.
효율성을 위해, comm의 표준 구현은 두 입력 파일을 사전순으로 정렬된 같은 줄 데이터 대조 순서로 배열될 것으로 예상합니다. sort 명령은 이 목적을 위해 사용될 수 있습니다.
comm 알고리듬은 현재 로케일의 대조하는 순서를 사용합니다. 만약 파일에서 행이 현재 로케일에 따라 둘 다 대조되지 않으면, 결과가 정의되지 않습니다.
Return code
diff와 달리, comm으로부터 반환 코드는 두 파일의 관계와 관련하여 논리적인 의미를 가지지 않습니다. 반환 코드 0은 성공을 나타내고 반환 코드 >0은 처리 중 오류가 발생했음을 나타냅니다.
Example
$ cat foo
apple
banana
eggplant
$ cat bar
apple
banana
banana
zucchini
$ comm foo bar
apple
banana
banana
eggplant
zucchini
이것은 두 파일에 하나의 banana가 있지만, 오직 bar는 두 번째 banana를 가짐을 보여줍니다.
좀 더 구체적으로 말하면, 출력 파일은 다음과 같은 모양을 하고 있습니다. 열은 선행하는 탭 문자의 개수로 해석됩니다. \t는 탭 문자를 나타내고 \n은 줄 바꿈 문자를 나타냅니다 (Escape character#Programming and data formats).
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
0 | \t | \t | a | p | p | l | e | \n | ||
1 | \t | \t | b | a | n | a | n | a | \n | |
2 | \t | b | a | n | a | n | a | \n | ||
3 | e | g | g | p | l | a | n | t | \n | |
4 | \t | z | u | c | c | h | i | n | i | \n |
Comparison to diff
일반적으로, diff는 comm보다 더 강력한 유틸리티입니다. 더 간단한 comm은 스크립트에서 사용하기에 가장 적합합니다.
comm과 diff의 주요 차이점은 comm이 정렬하기 전에 줄 순서에 대한 정보를 버린다는 것입니다.
comm과 diff의 사소한 차이점은 comm이 두 파일 사이에 줄이 "변경"되었음을 나타내려고 하지 않는다는 것입니다; 행은 "from file #1", "from file #2", 또는 "in both" 열에 표시됩니다. 이것은 만약 그것들이 오직 미묘한 차이를 가지면 두 줄이 다른 것으로 여겨지기를 원하면 유용하게 될 수 있습니다.
Other options
comm은 세 개의 열 중 임의의 것을 표시하지 않는 명령줄 옵션을 가집니다. 이것은 스크립팅에 유용합니다.
표준 입력에서 하나의 파일 (둘 다는 아님)을 읽는 옵션도 있습니다.
Limits
다음 출력 행이 작성되기 전에 줄 비교 동안 각 입력 파일에서 최대 전체 줄을 버퍼링해야 합니다.
일부 구현은 시스템 메모리가 충분하면 임의의 줄 길이 제한을 부과하지 않는 readlinebuffer() 함수로 줄을 읽습니다.
다른 구현은 fgets() 함수로 줄을 읽습니다. 이 기능은 고정된 버퍼를 요구합니다. 이들 구현에 대해, 버퍼는 종종 POSIX 매크로 LINE_MAX에 따라 크기가 조정됩니다.
External links
- comm: select or reject lines common to two files – Commands & Utilities Reference, The Single UNIX Specification, Issue 7 from The Open Group
- comm(1) – Plan 9 Programmer's Manual, Volume 1
- comm(1) – Inferno General commands Manual