주어진 파일의 두 번째 열에 있는 값을 선호하여 공통 첫 번째 열을 기반으로 두 개의 2열 파일을 병합합니다.

주어진 파일의 두 번째 열에 있는 값을 선호하여 공통 첫 번째 열을 기반으로 두 개의 2열 파일을 병합합니다.

1.txt두 개의 탭으로 구분된 열이 포함된 두 개의 텍스트 파일이 있습니다 2.txt. 두 파일의 첫 번째 열은 토큰화된 텍스트로 구성됩니다. 두 파일 모두에서 첫 번째 열은 동일합니다. 단어 순서가 중요합니다. 두 번째 열은 레이블로 구성됩니다. 첫 번째 파일에서는 토큰화가 완전하지만 부정확합니다. 두 번째 파일에서는 불완전하지만 정확합니다.

1.txt:

I          3
was        5
there      6
yesterday  6
.          0

2.txt:

I          3
was        
there      12
yesterday  
.          0

각 줄에 레이블이 있도록 (줄의 순서를 유지하면서) 두 파일을 병합하고 싶으므로 2.txt다음과 같이 보다 정확한 파일(예: file 의 레이블)이 선호됩니다.

I          3
was        5
there      12
yesterday  6
.          0

을 사용해 보았지만 join두 개의 태그만 표시되거나 한 파일의 태그만 표시됩니다.

$ join 1.txt 2.txt 
I          3 3
was        5 
there      6 12
yesterday  6 
.          0 0
$ join -1 1 -2 1 -o 1.1,2.2 1.txt 2.txt
I          3
was        
there      12
yesterday  
.          0

이 답변사용하면 awk비슷해 보이지만 예상한 결과를 제공하지 않습니다. 나는 또한 coreutils를 사용하는 것을 선호합니다.

답변1

사용 awk:

awk 'NR==FNR{if (NF==2) a[$1]=$2; next}
     {print $1,($1 in a ? a[$1] : $2)}' 2.txt 1.txt
  • NR==FNR번호 레코드가 파일 번호 레코드와 같은 경우(첫 번째 파일에 있는 경우)
  • a[$1]=$2첫 번째 필드를 키로 사용하여 두 번째 필드를 배열에 저장합니다.
  • $1 in a ? a[$1] : $2$1if는 print의 키 입니다 else printaa[$1]$2

답변2

또 다른 옵션은 다음과 같습니다.

join 1.txt 2.txt | awk -e '{if($NF == "") print $1, $(NF - 1); else print $1, $NF}' | column -t

이것은 만든다:

I          3
was        5
there      12
yesterday  6
.          0

이는 | column -t선택 사항이지만 멋진 열로 형식을 지정하면 됩니다.

관련 정보