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

これら2つのコマンドは、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使用RS="\n"しますが。file2RS=">"

答え2

awk2 つの入力フィールド区切り文字>と空白文字とともに使用されます。

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

最初のファイルを処理するときは、最初のフィールドを配列に保存します。
2番目のファイルを処理するときに現在の行が次に始まるかどうかをテストし、2番目のフィールドが配列にあるかどうかをテストする>フラグを設定します。printlineフラグがセットされると、現在の行が印刷されます。

関連情報