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(以便 file2.txt 中有一些输入行,其中 $5 位于 file1.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)并打印该行。

相关内容