根据文件A指定的顺序,使用文件A中的数字从文件B中获取唯一ID

根据文件A指定的顺序,使用文件A中的数字从文件B中获取唯一ID

我想使用 file 的编号根据 file 指定的顺序whitelist.txt从 file 获取唯一的标识号。例子:list.txtwhitelist.txt

$ cat whitelist.txt:  
2  
5  
7  
10   
11
(+8,000 more lines)

$ cat list.txt  
2  
172363  
14  
17  
612851  
172414  
172418  
172419  
172424  
19  
72457  
(+ 150,000 more lines)

这样我就可以重定向到一个新文件:

$ cat newfile.txt  
172363  
612851  
172418  
19   
72457  
(+8,000 more lines)

注意:此问题已被修改。以下 2017 年 5 月 5 日之前的答案基于输入样本 ( list.txt),其格式为(例如第一行)>CLocus_2_Sample_(而不仅仅是数字 2),文件名为file.fa(不是file.txt)。

答案1

根据修改后的数据,尝试如下操作:

$ sed -nf <(sed 's/.*/&p/g' whitelist.txt) list.txt >newfile.txt

这会将文件的条目whitelist.txt从 ie转换22p指示外部sed打印该行2==> 等于sed -n '2p'==> 打印第二行。
对于 的所有条目都会发生同样的情况whitelist.txt,创建一个 sed 脚本(通过进程替换提供外部 sed),包含2p5p7p等,并且打印 list.txt 的那些行。

替代方案:预处理whitelist.txt:

sed 's/.*/&p/g' whitelist.txt >whitelist2.txt  #or sed -i '....' whitelist.txt to overwrite whitelist.txt
sed -nf whitelist2.txt list.txt # you can redirect output to >newfile.txt

答案2

回复您的最新修订:

awk 'NR==FNR{z[$1]; next}FNR in z' whitelist.txt list.txt >newfile.txt

答案3

根据您所说的新规格,我们需要对其进行修改:

perl -e '
   $h{s/\n//r}++ for qx[cat ${\+shift}];
   $h{$.} && print while <>;
' whitelist.txt list.txt

解释

  • hash %h首先使用文件内容填充whitelist.txt,这是需要传递给Perl代码的第一个参数。请注意,qx[]运算符只不过是backquote运算符。

  • 然后我们打印第二个参数的行,即list.txt行号是hash %h.注:自 $.总是数字 AND > 0,这就是我们可以使用 just$h{$.}而不是 propah 的原因exists $h{$.}

结果

172363
612851
172418
19
72457

相关内容