匹配列并替换

匹配列并替换

我有两个非常大的文本文件,其中包含空格分隔的字段:

文件1

527858  51  2   27.92464882 8.63E-07
570289  82  2   30.12532071 2.87E-07
571034  90  2   29.26089611 4.43E-07
571033  90  2   28.56723908 6.26E-07
452403  104 2   28.27577506 7.24E-07
351390  100 2   28.16226794 7.67E-07
527858  50  2   27.92464882 8.63E-07

文件2

527858  rs435           
570289  rs564           
571034  rs654           
571033  rs345           
452403  rs665           
351390  rs787           
527858  rs435           

输出:

rs435   51  2   27.92464882 8.63E-07
rs564   82  2   30.12532071 2.87E-07
rs654   90  2   29.26089611 4.43E-07
rs345   90  2   28.56723908 6.26E-07
rs665   104 2   28.27577506 7.24E-07
rs787   100 2   28.16226794 7.67E-07
rs435   50  2   27.92464882 8.63E-07

比较 file1 和 file2 的第一列,并将 file1 的第一列替换为file2第二列中的名称。

答案1

我会尝试

awk 'FNR==NR { F2[$1]=$2 ; next } $1 in F2 {$1 = F2[$1] ; print } ' File2 File1

在哪里

  • FNR==NR { F2[$1]=$2 ; next }存储 File1 中的值
  • $1 = F2[$1]更换钥匙

答案2

这与awkin 中的基本思想相同阿彻玛的回答,用 Perl 实现:

$ perl -lane '$#F>1?print"$l{$F[0]} @F[1..$#F]":($l{$F[0]}=$F[1])' file2 file1
rs435 51 2 27.92464882 8.63E-07
rs564 82 2 30.12532071 2.87E-07
rs654 90 2 29.26089611 4.43E-07
rs345 90 2 28.56723908 6.26E-07
rs665 104 2 28.27577506 7.24E-07
rs787 100 2 28.16226794 7.67E-07
rs435 50 2 27.92464882 8.63E-07

解释

  • -lane-l向每个调用添加一个换行符print,并从每行输入中删除尾随换行符。 make-aperl作用如下awk:它会自动将每个输入行拆分到数组中@F。因此,第一个字段将是$F[0],第二个字段$F[1]等等。-n告诉 perl 逐行读取其输入文件并将给定的脚本应用于-e每个文件。

  • $#F>1? ... : ...:这是一个 C 风格的条件运算符。一般格式是condition ? foo : bar:“如果condition为真,则执行 do foo,如果不为真,则执行 do bar。这$#F是数组中数组索引的数量@F。由于数组从 开始0,因此 的值1表示包含两个元素的数组。因此,这print ...如果数组中的元素超过 2 个,则会执行第一个块( ,见下文),这仅适用于file1

  • ($l{$F[0]}=$F[1]):这对 file2 的每一行执行,对于每行少于 3 个字段。它填充 hash %l,其键是 的第一个数字字段file2,其值是关联的 rsID。
  • print"$l{$F[0]} @F[1..$#F]"%l:打印第一个字段 ( ) 的哈希值中保存的 rsID $l{$F[0]}、一个空格,然后打印该行中的其余字段 ( $F[1..$#F])。

就我个人而言,我可能会使用该awk解决方案,或者最坏的情况是使用perl我提供的解决方案,因为他们不需要对文件进行排序。但是,由于您标记了join,因此使用该工具的方法如下:

$ join -o 2.2 1.2 1.3 1.4 1.5 <(sort file1) <(sort file2)
rs787 100 2 28.16226794 7.67E-07
rs665 104 2 28.27577506 7.24E-07
rs435 50 2 27.92464882 8.63E-07
rs435 50 2 27.92464882 8.63E-07
rs435 51 2 27.92464882 8.63E-07
rs435 51 2 27.92464882 8.63E-07
rs564 82 2 30.12532071 2.87E-07
rs345 90 2 28.56723908 6.26E-07
rs654 90 2 29.26089611 4.43E-07

相关内容