두 개의 파일을 하나로 병합

두 개의 파일을 하나로 병합

ABC.txt와 DEF.txt라는 두 개의 파일이 있다고 가정하면 데이터는 다음과 같습니다.

ABC.txt:

abc 14
dka 1
def 51

DEF.txt:

def 12
ckd 41

두 파일에서 열 1과 2를 grep하고 세 번째 파일에 쓰면서 세 번째 파일에 열 1의 중복 없이 두 파일이 모두 포함되도록 하고 싶습니다. 두 파일과 존재하지 않는 값에 대해 세 번째 값이 배치됩니다. 파일은 0으로 배치됩니다. 어떻게 하나요?

내 예상 출력은 다음과 같습니다(출력:

       ABC     DEF
abc    14      0
ckd    0       41
def    51      12
dka    1       0

답변1

$ join -j 1 -a 1 -a 2 -o 0,1.2,2.2 -e 0 <(sort ABC.txt) <(sort DEF.txt)
abc 14 0
ckd 0 41
def 51 12
dka 1 0

제목과 열 간격은 연습 문제로 남겨둡니다.

답변2

Awk해결책:

awk 'BEGIN{ 
         OFS="\t"; print "", "ABC", "DEF" 
     }
     NR==FNR{ a[$1]=$2; next }
     { 
         if ($1 in a) { v=a[$1]; delete a[$1] } 
         $3 = v+0 
     }1; 
     END{ for(i in a) print i, 0, a[i] }' DEF.txt ABC.txt

산출:

    ABC DEF
abc 14  0
dka 1   0
def 51  12
ckd 0   41

답변3

GNU 데이터 혼합데이터에 약간의 사전 처리가 필요하지만 이러한 종류의 작업에 적합한 크로스탭(피벗 테이블) 옵션이 있습니다.

awk '{print $0, substr(FILENAME,1,length(FILENAME)-4)}' ABC.txt DEF.txt | 
  datamash -Ws --filler='0' crosstab 1,3 unique 2
        ABC     DEF
abc     14      0
ckd     0       41
def     51      12
dka     1       0

관련 정보