파일의 한 열을 다른 열과 비교하고 일치하면 열을 추가합니다.

파일의 한 열을 다른 열과 비교하고 일치하면 열을 추가합니다.

한 파일의 한 열을 다른 파일의 다른 열과 비교하고 싶습니다. 열이 일치하면 첫 번째 파일의 첫 번째 열을 두 번째 파일의 첫 번째 열로 추가하고 싶습니다.

파일 1

FID IID
456 2
123 1
789 3
112 4

파일 2

IID column1 column2 column3... column464
1 Value11 Value12 etc etc ... etc
7 Value71 Value72 etc etc ... etc
2 Value21 Value22 etc etc ... etc
6 Value61 Value62 etc etc ... etc
3 Value31 Value32 etc etc ... etc

원하는 출력

FID IID column1 column2 column3... column464
123 1 Value11 Value12 etc etc ... etc
456 2 Value21 Value22 etc etc ... etc
789 3 Value31 Value32 etc etc ... etc

답변1

사용 awk:

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

첫 번째 연산 블록에서는 file1을 다음과 같은 연관 배열로 읽어 들입니다.id여기서 키는 $2 열이고 값은 $1 열입니다. NR==FNR첫 번째 입력 파일을 처리할 때 항상 true인 조건은 awk의 내부 환경 변수와 NR(질소수량오른쪽ecords)는 FNR(에프엘리질소수량오른쪽ecord), FNR은 다음 입력 파일마다 재설정됩니다.

그런 다음 다음 작업 블록에서는 file2의 첫 번째 열 $1이 있는지 확인합니다.id그런 다음 array는 해당 값을 인쇄하고 id[$1]그 뒤에는 file2에 대한 $0의 전체 줄이 표시됩니다.

답변2

제한된 수의 필드의 경우 다음을 시도하십시오.

join -12 -21 -o1.1,0,2.2,2.3,2.4  <(sort -nk2,2 file1) <(sort -n file2) 2>/dev/null
FID IID column1 column2 column3...
123 1 Value11 Value12 etc
456 2 Value21 Value22 etc
789 3 Value31 Value32 etc

하지만 언급한 필드 수로 인해 형식 지정이 다소 번거로울 수 있습니다.

관련 정보