다른 열과 일치하는 파일에 열을 추가하려면 어떻게 해야 합니까?

다른 열과 일치하는 파일에 열을 추가하려면 어떻게 해야 합니까?

두 번째 열의 숫자에 따라 file1의 첫 번째 열을 파일 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첫 번째 파일과 일치하는지 확인합니다.

관련 정보