두 번째 열의 숫자를 기준으로 파일 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
$2
next
이 표현식은 두 번째 파일의 첫 번째 필드가 다음 위치에 있는지 ($1 in ar)
확인합니다.$1
색인. 의 배열이 ar
있는 경우 ar
이 명령문을 사용하여 두 번째 파일의 두 번째 필드를 인쇄합니다 {print ar[$1],$2}
.
($1 in ar)
두 번째 파일의 $1이 일치하는지 여부를 의미하므로 중요합니다.색인의 ar
. 그리고 ar
첫 번째 파일의 $2에 대한 색인을 생성합니다. 따라서 $1
두 번째 파일이 $2
첫 번째 파일과 일치하는지 확인합니다.