다른 열과 일치하는 열을 파일에 추가하는 방법은 무엇입니까?

다른 열과 일치하는 열을 파일에 추가하는 방법은 무엇입니까?

두 번째 열의 숫자를 기준으로 파일 1의 첫 번째 열을 파일 2와 어떻게 일치시킬 수 있습니까?

문서파일 1

k002  25
k004  54
k003  23

문서파일 2

25 h
23 j
54 hg

원하는 출력

k002 25 h
k003 23 j
k004 54 hg

어떻게 해야할지 모르겠고 비슷한 질문도 찾지 못했습니다.

awk 'matching {print ... $1, $2}' file1 file2 > file_des

답변1

다음을 수행할 수 있습니다.

awk 'NR == FNR { x[$2]=$1; next} { print x[$1], $0 }' file1 file2

어디:

  • FNR: 현재 입력 파일의 입력 레코드 번호입니다.
  • NR: 지금까지 본 총 입력 레코드 수입니다.

이렇게 하면 전체 내용이 file1메모리로 읽혀집니다.

답변2

원본 파일 순서를 유지하는 데 신경 쓰지 않는다면 다음을 사용할 수 있습니다 join.

# sort the first file:
sort -k2 file1 > nfile1

# Sort the second file:
sort file2 > nfile2

join -1 2 -2 1 -o 1.1,1.2,2.2 nfile1 nfile2 > joined_file

bash또는 @Ed Morton이 제안한 것처럼 프로세스 대체를 지원하는 다른 쉘을 사용하는 경우 다음과 같은 방법으로 임시 파일 생성을 피할 수 있습니다.

join -1 2 -2 1 -o 1.1,1.2,2.2 <(sort -k2 file1) <(sort file2)

답변3

사용 awk:

awk 'NR==FNR{ar[$2]=$0;next}($1 in ar){print ar[$1],$2}' file1 file2

이 명령에서는 첫 번째 파일을 읽은 후 0으로 설정되므로 첫 번째 파일에만 적용 NR==FNR해야 합니다 . 표현식에서 인덱스 배열이 생성 되고 추가 작업이 수행되지 않습니다 .{ar[$2]=$0;next}FNR{ar[$2]=$0;next}ar$2next

이 표현식은 두 번째 파일의 첫 번째 필드가 다음 위치에 있는지 ($1 in ar)확인합니다.$1색인. 의 배열이 ar있는 경우 ar이 명령문을 사용하여 두 번째 파일의 두 번째 필드를 인쇄합니다 {print ar[$1],$2}.

($1 in ar)두 번째 파일의 $1이 일치하는지 여부를 의미하므로 중요합니다.색인ar. 그리고 ar첫 번째 파일의 $2에 대한 색인을 생성합니다. 따라서 $1두 번째 파일이 $2첫 번째 파일과 일치하는지 확인합니다.

관련 정보