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