如果两列部分匹配,则用 awk 替换第三列

如果两列部分匹配,则用 awk 替换第三列

文件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

我正在寻找一种方法来找到和之间的部分匹配$1a.txt$1 b.txt用相应的$7替换。a.txt$2b.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 中“打印此行”的简写。

相关内容