打印 file1 和 file2 中的匹配行

打印 file1 和 file2 中的匹配行

我有 file1.txt 和 file2.txt 我想将匹配的行打印到新文件中

文件1.txt

FOMPING00002015
FOMPING00008750 
FOMPING00003379 
FOMPING00009073
FOMPING00007164 
FOMPING00009598

文件2.txt

>FOMPING00013293 Protein of unknown function
ATGCCCTGCTCGTCGCTCGAGCGGGATCATAGCCAGCATGAAGTTATACCGTCATCGCAG
AGCCAGGAACGCGACTTTGTGCCGCCTAATGGTGACATCAGGAGTCGGGCGAGAACGACA
TCCGACGAAATTGTACCCACATCGCAG
>FOMPING00003379 Protein of unknown function
ATGCCCTGCTCGTCGCTCGAGCGGGATCATAGCCAGCATGAAGTTATACCGTCATCGCAG
AGCCAGGAACGCGACTTTGTGCCGCCTAATGGTGACATCAGGAGTCGGGCGAGAACGACA
TCCGACGAAATTGTACCCACATCGCAGTA
>FOMPING00009073 Protein of unknown function 
ATGTCCTCTTGGTCTGGTTCTTCTTACCCTCCACCTCCACGCGCACGTTCGCGCTCTCGC
TCCCCTTATCGTGGGTCTTATCCTGCGAGACCCGGGTATCCAGAGCCTGGATACTCGCAG
>FOMPING00000581 Similar to mcs4: Response regulator mcs4  
ATGTCCTCTTGGTCTGGTTCTTCTTACCCTCCACCTCCACGCGCACGTTCGCGCTCTCGC
TCCCCTTATCGTGGGTCTTATCCTGCGAGACCCGGGTATCCAGAGCCTGGATACTCGCAG
GATCCATACCGTGCCGACTGGGAGGCTTATGACAGAGAGCGCGCATGGGCCTCCTACGAG

我尝试了几个命令

grep -F file1.txt file2.txt > output.txt
grep -Ff file1.txt file2.txt > output.txt

这两个命令仅输出 file2.txt 的第一行

输出.txt

>FOMPING00013293 Protein of unknown function
>FOMPING00000581 Similar to mcs4: Response regulator mcs4.

我想要输出文件就像 file2.txt 一样,其中包含序列。

谢谢

答案1

这在我的测试中似乎工作正常。诀窍是使用“>”作为记录/块分隔符。

awk 'NR==FNR{a[$0];next};$1 in a{print ">" $0}' file1.txt RS=">" file2.txt
#or alternativelly, due to the whitespace present in the end of each line of file1.txt
awk 'NR==FNR{a[$1];next};$1 in a{print ">" $0}' file1.txt RS=">" file2.txt

RSawk 末尾的位置会影响 后面的文件RS。在我的命令中,file1使用 default 进行解析RS="\n",但file2使用RS=">".

答案2

awk与两个输入字段分隔符>和空格字符一起使用:

awk -F'[> ]' '{
  if (NR==FNR){
    a[$1]
  }
  else {
    if (substr($0,0,1) == ">"){
      printline=($2 in a)
    }
    if (printline){
      print
    }
  }
}' file1.txt file2.txt

处理第一个文件时,将第一个字段存储在数组中。
处理第二个文件时,测试当前行是否以 开头>,并设置一个标志printline测试第二个字段是否存在于数组中。如果设置了标志,则打印当前行。

相关内容