공통 열로 두 파일 결합

공통 열로 두 파일 결합

두 개의 파일이 있습니다. 첫 번째는,

a 0.1 c t 0.4
c 0.25 g a 0.1
d 0.567 c c 0.00004
q 0.76 f c 0.05

두 번째는,

a hello
c goodbye
d morning
q hungry

다음과 같이 파일을 만들고 싶습니다.

hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05

어떻게 해야 하나요?

답변1

이 시도,

파일이 정렬되어 있으므로 join다음 명령을 직접 사용할 수 있습니다.

 join  Second First | cut -f2- -d' '

hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05

정렬되지 않은 경우 다음 코드를 사용하십시오.

join  <(sort second) <(sort first) | cut -f2- -d' '
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05

답변2

awk첫 번째 열만 사용하도록 두 번째 파일을 처리한 다음 첫 번째 파일을 사용하여 채우는 방식은 매우 간단합니다 .

awk 'FNR == NR { map[$1] = $2; next } ($1 in map) { $1 = map[$1] }1 ' second first

답변3

또 다른 join방법은 조인의 내장 기능을 사용하는 것입니다.

$ join -o 2.2,1.2,1.3,1.4,1.5  <(sort file1) <(sort file2)
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05

-o출력 형식을 지정할 수 있습니다 . 여기서는 join파일 2( )의 두 번째 필드를 사용한 2.2다음 파일 1( )의 첫 번째, 두 번째, 세 번째, 네 번째 및 다섯 번째 필드를 사용하도록 지시합니다 1.2,1.3,1.4,1.5.

답변4

페이스트를 사용하세요.

paste <(cut -d ' ' -f2- file2) <(cut -d ' ' -f2- file1)

쉘을 사용하십시오.

while IFS= read -r file2 <&3; do 
  IFS= read -r file1
  printf '%s %s\n' "${file2##* }" "${file1#* }"
done 3<file2 <file1

지침

  • 둘 다 정렬되지 않았으며 대용량 파일/데이터가 관련되면 쉘이 느려집니다.

  • 들여쓰기 없이 서식을 직접 붙여넣습니다.

관련 정보