열 교체를 위한 awk

열 교체를 위한 awk

파일 1의 열 1이 파일 2의 열 5와 일치하면 파일 1의 열 1을 파일 2의 열 1로 바꿔야 합니다.

파일 1

ENSG00000237491    1     714150     745440      2       1  143562      
ENSG00000230092    1     736259     745541      2       1  143562    
ENSG00000269831    1     738532     739137      2       1  143562    
ENSG00000187634    1     860260     879955     26      20  130731 

파일 2

AL669831.1      1       738532  739137  ENSG00000269831
SAMD11          1       860260  879955  ENSG00000187634
RP11-206L10.9   1       714150  745440  ENSG00000237491
RP11-206L10.8   1       736259  745541  ENSG00000230092

출력은 다음과 같아야합니다

RP11-206L10.9    1     714150     745440      2       1  143562      
RP11-206L10.8    1     736259     745541      2       1  143562    
AL669831.1       1     738532     739137      2       1  143562    
SAMD11           1     860260     879955     26      20  130731 

아래 코드를 시도했지만 작동하지 않고 출력이 인쇄되지 않으며 오류 없이 즉시 중지됩니다.

 awk 'NR==FNR{a[$1]=$1;next} $5 in a {$1=a[$1];print}' FS='\t' OFS='\t' file1.txt file2.txt  > output.txt

감사합니다!

답변1

file1.txt위와 같이 파일과 편집된 버전을 사용하여 file2.txt(그래서 file1.txt에 $5가 있는 file2.txt에 일부 입력 행이 있음):

AL157931.1      13      23551994        23552136        ENSG00000237491
HMGA1P6 13      23708313        23708703        ENSG00000230092
RNY3P4  13      23726725        23726825        ENSG00000207157

file1.txt를 읽기 전에 file2.txt를 읽으면 다음과 같은 출력을 얻을 수 있습니다.

$ awk 'BEGIN {FS=OFS="\t"}
       NR==FNR {a[$5]=$1; next};
       $1 in a {$1=a[$1];print}' file2.txt file1.txt 
AL157931.1      1       714150  745440  2       1       143562
HMGA1P6 1       736259  745541  2       1       143562

이것이 작동하는 방식의 핵심은 키가 file2의 $5이고 값이 동일한 파일의 $1인 연관 배열을 구축하려고 한다는 점을 깨닫는 것입니다.

그런 다음 file1을 반복할 때 $1이 배열의 키인지 확인합니다. 그렇다면 $1을 일치하는 값(즉, file2의 해당 $1)으로 바꾸고 해당 행을 인쇄합니다.

관련 정보