我有两个文件,每个文件有 3 个序列(每个序列 200 个长度),标题如下:
#File1
>1
TGATTGCATAACCACTTAACATCTTGTTTTATCTAAATAAAATTAAGCATGTTATCTTTTTGGGGCACTCCTGGGGCAGTAGATGCCAGTTGTTGATTCAGTATATCTACTTGTGACTGGTTATTATCCCGATTTTTTTAGTTTTAAGGTGTTGACATAGCCATCCATGCTCCATATACTGTATAGACCATCTGAGCGTT
>2
TGGGAAAACAGCATTCAGCGGTGGCTTATTCCTGCTAAGGATGTTGGCCGCATTCATGCTGAGCACAACCTCGACGGCCTGCTGAGGGGCGATTCGGCATCCCGCGCTGCCTTTATGAAGGCAATGGGAGAGGCAGGGCTACGCACCATCAACGAGATGCGACGAACGGACAACCTCCCGCCATTGCCGGGTGGCGATGT
>3
GAAATGGGAACCGCGAACATGCCTGCACATCCGTTTGTGCGACCCGCTTACGATACTCGCGAGGAAGAGGCCGCCAGCGTCGCCATTGCCAGGATGAATCAGGCTATTGATGAGGTATTGAGCAAGTGAATGAAGATAATATCTACGCCTTGCTTTCTCCCCTGGCAGAAGGACGGGTATATCCCTATGTTGCGCCATTA
#File2
>1
TGATTGCATAACCACTTAACATCTTGTTTTATCTAAATAAAATTAAGCATGTTATCTTTTTGGGGCACTCCTGGGGCAGTAGATGCCAGTTGTTGATTCAGTATATCTACTTGTGACTGGTTATTATCCCGATTTTTTTAGTTTTAAGGTGTTGACATAGCCATCCATGCGGGAAGGTGCAGCATAATGTGCTTTGGATT
>2
TGAGTGCCCCATTTGTGAAGCAATAAAGTTCGGGTTCGCGCCAGCGGCAAGCGCCCAGCATGCACCGATTTTTTTAGTTTTAAGGTGTTGACATTAGGTATGTCGGGACTGGTATGCTTTCCTGTGTCGCAGCCCGGCGCGTCTCAATGCAGATTCCCATATCCTGTTCATCCATATACTGTATAGACCATCTGAGCGTT
>3
TACCTGAGCGATCGGTAATTTGCGGATTGAAGACAAAGGTGCAGGAATGAGTTTTTGTACGACCGTATTCGCGCAGCTTTACTTCAATTTTGTGCTGTTTGCTCAGCTTCGTGAAAGAGGCCTGACTTTTTAAAGCATCAATTGCTGGCTGCACAAGATGTATCACCCTGTCGGTTCCTGCCTGGGTTTTCGGCAGGGTG
我想比较 file1 与 file2 中的每个序列(不考虑标头)(File1: 1,2,3 vs File2: 1,2,3),如果恰好 30 个连续字符相同从这两个序列中,我想将具有匹配项的序列的标题(仅那些具有匹配项的序列)保存在输出文件中。
例如 30 个字符的字符串:
TGATTGCATAACCACTTAACATCTTGTTTT
存在于文件 1 的 seq1 和文件 2 的 seq1 中。
TCCATATACTGTATAGACCATCTGAGCGTT
存在于文件 1 的 seq1 和文件 2 的 seq2 中。
所以我最终会得到一个输出文件,例如:
[1,1]
[1,2]
...
答案1
$ cat tst.awk
BEGIN { wid = 30 }
sub(/^>/,"") { hdr=$1; next }
NR == FNR { a[hdr]=$0; next }
{
for ( hdrA in a ) {
strA = a[hdrA]
lgthA = length(strA)
for ( idxA=1; idxA<=(lgthA - wid + 1); idxA++ ) {
substrA = substr(strA,idxA,wid)
if ( index($0, substrA) ) {
printf "[%s,%s]\n", hdrA, hdr
break
}
}
}
}
$ awk -f tst.awk file1 file2
[1,1]
[1,2]