awk는 공통 열을 기반으로 두 개의 txt 파일을 병합합니다.

awk는 공통 열을 기반으로 두 개의 txt 파일을 병합합니다.

awk를 사용하여 일치하는 열을 기반으로 두 파일을 병합하고 싶습니다.

b.txt(탭으로 구분)

A
B
C
D
C
C
E
G

a.txt(탭으로 구분)

1       2       2       4       19      A
2       2       3       3       12      B
3       2       9       2       5       C
4       3       8       0       9       D
5       5       4       1       1       E

그런 다음 스크립트를 실행합니다.

awk -F"\t" 'BEGIN{OFS="\t"} {if (NR==FNR) {a[$NF]=$0; next} if ($NF in a) {print a[$1]}}' a.txt b.txt > c.txt

나는 이와 같은 c.txt를 얻습니다.

1   2   2   4   19  A
2   2   3   3   12  B
3   2   9   2   5   C
4   3   8   0   9   D
3   2   9   2   5   C
3   2   9   2   5   C
5   5   4   1   1   E

사실 내가 원하는 결과는

1   2   2   4   19  A
2   2   3   3   12  B
3   2   9   2   5   C
4   3   8   0   9   D
3   2   9   2   5   C
3   2   9   2   5   C
5   5   4   1   1   E
                    G

또는

A   1   2   2   4   19  
B   2   2   3   3   12  
C   3   2   9   2   5   
D   4   3   8   0   9   
C   3   2   9   2   5   
C   3   2   9   2   5   
E   5   5   4   1   1   
G

나에게 어떤 제안이 있나요? 고마워하는!

답변1

몇 가지 조정만 하면 신중한 실험을 통해 원하는 결과를 얻을 수 있습니다. 원하는 첫 번째 결과를 얻으려면

awk -F"\t" '
  BEGIN { OFS = FS } 
  NR == FNR { a[$NF] = $0; pos = NF; next }
  { if ( $NF in a ) { $NF = a[$1]; } else { $pos = $1; $1 = ""; } } 1
' a.txt b.txt 

답변2

사용 csvjoin:

$ csvjoin -H --tabs --left -c 1,6 b.txt a.txt | csvformat -K 1 -T

-H: 입력 tsv파일에 헤더 행이 없습니다.

--tsbs또는 -t: 입력 파일이 tab구분됩니다.

--left완전 외부 조인을 수행합니다.

-c 1,6첫 번째 파일의 열 1을 두 번째 파일의 열 6과 결합합니다.

csvformat옵션:

-K 1명령으로 추가된 첫 번째 헤더 행을 제거합니다 csvjoin.

-T구분 기호를 에서 으로 변경 comma합니다 tab.

관련 정보