我有 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
RS
awk 末尾的位置会影响 后面的文件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
测试第二个字段是否存在于数组中。如果设置了标志,则打印当前行。