文件a.txt
chr:1:10539:A:C 10539 C A 0.545987 0.508902 0 0.36065 + 1
chr:2:13494:A:G 13494 A G 0.330493 0.0264746 0 0.733423 + 1
chr:7:13494:A:G 13494 A G 0.330493 0.0264746 0 0.733423 + 1
文件b.txt
1 4972
2 4972
3 4972
7 4970
我正在寻找一种方法来找到和之间的部分匹配$1
,a.txt
并$1
b.txt
用相应的$7
替换。a.txt
$2
b.txt
因此输出将如下所示
chr:1:10539:A:C 10539 C A 0.545987 0.508902 4972 0.36065 + 1
chr:2:13494:A:G 13494 A G 0.330493 0.0264746 4972 0.733423 + 1
chr:7:13494:A:G 13494 A G 0.330493 0.0264746 4970 0.733423 + 1
感谢您的任何帮助。
答案1
一种awk
方法:
$ awk 'NR==FNR{a[$1]=$2; next} {split($1,b,/:/); $7=a[b[2]]}1;' b.txt a.txt
chr:1:10539:A:C 10539 C A 0.545987 0.508902 4972 0.36065 + 1
chr:2:13494:A:G 13494 A G 0.330493 0.0264746 4972 0.733423 + 1
chr:7:13494:A:G 13494 A G 0.330493 0.0264746 4970 0.733423 + 1
解释
NR==FNR{a[$1]=$2; next}
:NR
是当前输入行的行号,FNR
是当前文件的当前行号。只有在读取第一个文件时,这两者才会相等。因此,这将保存来自的信息,该b.txt
数组a
的索引是来自的染色体b.txt
,其值是相关数字。next
跳到下一行并确保不会运行第二个块b.txt
。split($1,b,/:/); $7=a[b[2]]
:这只会针对 运行a.txt
。首先,它将 上的第一个字段拆分:
到数组 中b
。因此 的第二个元素b
将是染色体。然后,它将文件的第 7 个字段设置a
为 中存储的染色体数组中存储的任何内容b[2]
(这就是 的a[b[2]]
意思:a[ b[2] ]
)。1;
:这是 awk 中“打印此行”的简写。