我有两个非常大的文本文件,其中包含空格分隔的字段:
文件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
这与awk
in 中的基本思想相同阿彻玛的回答,用 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-a
的perl
作用如下awk
:它会自动将每个输入行拆分到数组中@F
。因此,第一个字段将是$F[0]
,第二个字段$F[1]
等等。-n
告诉 perl 逐行读取其输入文件并将给定的脚本应用于-e
每个文件。$#F>1? ... : ...
:这是一个 C 风格的条件运算符。一般格式是condition ? foo : bar
:“如果condition
为真,则执行 dofoo
,如果不为真,则执行 dobar
。这$#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