当文件 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)并打印该行。