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
RS
awkの末尾の位置は後続のファイルに影響しますRS
。私のコマンドは解析にデフォルト値をfile1
使用RS="\n"
しますが。file2
RS=">"
答え2
awk
2 つの入力フィールド区切り文字>
と空白文字とともに使用されます。
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
フラグがセットされると、現在の行が印刷されます。