awk 출력에서 ​​아래에 표시된 유사한 파일과 다른 파일을 비교하시겠습니까?

awk 출력에서 ​​아래에 표시된 유사한 파일과 다른 파일을 비교하시겠습니까?

다음 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( // 구문)을 사용하여 첫 번째 줄을 건너뛸 수 있습니다 .zshbash

join -a 1 -a 2 -o 0,1.2,2.2 -e - <(tail -n +2 file1) <(tail -n +2 file2)

관련 정보