다음 2개 파일을 비교하고 이 2개 파일 간의 비교를 보여주고 싶습니다.
파일 1:
DATE DS
2012-08-02 1
2013-06-23 1
2013-06-27 2
2013-06-28 2
2013-06-29 779
문서 #2:
DATE DE
2013-06-16 5
2013-06-17 1
2013-06-18 3
2013-06-19 1
2013-06-20 5
2013-06-21 6
2013-06-22 6
2013-06-23 6
2013-06-24 5
2013-06-25 9
2013-06-26 7
2013-06-27 22
2013-06-28 59
2013-06-29 334
2013-06-30 11
문서 #1과 #2의 비교:
DATE DS DE
2012-08-02 - 1
2012-08-05 - 2
2013-06-16 5 -
2013-06-17 1 -
2013-06-18 3 -
2013-06-19 1 -
2013-06-20 5 -
2013-06-21 6 -
2013-06-22 6 -
2013-06-23 6 -
2013-06-24 5 -
2013-06-25 9 -
2013-06-26 7 1
2013-06-27 22 2
2013-06-28 59 2
2013-06-29 334 779
2013-06-30 11 -
위의 file1, DATE 및 DS는 특정 날짜에 대해 "데이터 선택"이 얼마나 많은 선택 항목을 가지고 있는지 나타냅니다. 파일 1과 파일 2에도 동일한 숫자의 "비활성화됨"(DE)이 표시되지만 날짜가 다릅니다.
이제 AWK를 사용하여 file1과 file2를 표시하고 싶습니다.
두 파일 모두 $1의 날짜, 파일 1의 $2, 파일 2의 $2 날짜입니다. 특정 날짜를 비교하는 경우 DE, DA도 표시됩니다.
예를 들어:
DATE DE DS
2012-08-1 - 1 # Date is present in $1 from file1 but file2 is not there.
# This is the date I want. Also I want to display a (-) for
# DE which is not there.
답변1
아마도:
join -a 1 -a 2 -o 0,1.2,2.2 -e - file1 file2
위 명령에 대한 설명
join
대부분의 Linux 기반 배포판과 마찬가지로 GNU 시스템을 사용하는 경우 다음을 사용하여 옵션을 찾을 수 있습니다.
$ info coreutils 'join invocation'
또는
$ info join
(가정정보디렉토리가 올바르게 유지됩니다)
아니면 확인할 수 있습니다POSIX 사양Unices에서 무엇이 보장되는지 확인하세요.
위의 옵션은 다음과 같습니다.
`-a FILE-NUMBER'
Print a line for each unpairable line in file FILE-NUMBER (either
`1' or `2'), in addition to the normal output.
이는 날짜(결합 필드)가 둘 다에 표시되지 않는 쌍을 이루지 않은 행에 대한 요구 사항을 충족합니다.
`-o FIELD-LIST'
Construct each output line according to the format in FIELD-LIST.
Each element in FIELD-LIST is either the single character `0' or
has the form M.N where the file number, M, is `1' or `2' and N is
a positive field number.
이 옵션은 각 출력 라인에 표시될 형식을 구성합니다 join
. A는 0
두 파일 간에 일치하는 필드를 내보냅니다. 이것이 날짜입니다. 는 1.2
첫 번째 파일(file1)의 두 번째 열이고 2.2
두 번째 파일(file2)의 두 번째 열입니다.
`-e STRING'
Replace those output fields that are missing in the input with
STRING.
이 옵션은 file1 또는 file2의 누락된 필드에 사용할 문자를 지정합니다. 이것이 -
최종 출력에 생성되는 이유입니다.
크로마토그래피 컬럼 사용
@GlennJackman의 제안을 활용하면 동일한 크기의 열에 보기 좋게 형식이 지정되도록 출력을 더욱 정리할 수 있습니다.
$ join -a 1 -a 2 -o 0,1.2,2.2 -e - file1 file2 | column -t
DATE DS DE
2012-08-02 1 -
2013-06-16 - 5
2013-06-17 - 1
2013-06-18 - 3
2013-06-19 - 1
2013-06-20 - 5
2013-06-21 - 6
2013-06-22 - 6
2013-06-23 1 6
2013-06-24 - 5
2013-06-25 - 9
2013-06-26 - 7
2013-06-27 2 22
2013-06-28 2 59
2013-06-29 779 334
2013-06-30 - 11
입력 파일은 조인 키를 기준으로 정렬되어야 합니다(기본값은 첫 번째 필드임). 위에서는 대부분의 로케일에서 "DATE"가 "2013" 이후에 정렬되기 때문에 그렇지 않습니다. 따라서 join
모든 구현에서 작동이 보장되지는 않습니다 .
ksh93
( // 구문)을 사용하여 첫 번째 줄을 건너뛸 수 있습니다 .zsh
bash
join -a 1 -a 2 -o 0,1.2,2.2 -e - <(tail -n +2 file1) <(tail -n +2 file2)