Awk 当file1中的两个字段与file2中单个字段的子字符串匹配时,打印file2的行

Awk 当file1中的两个字段与file2中单个字段的子字符串匹配时,打印file2的行,awk,Awk,目标:当文件1的字段1($1)和字段4($4)都与文件2中以“”开头的行中字段4($4)中的子字符串匹配时,打印文件2的行 重要注意事项#1:要打印输出的行包括要搜索的行以及在它之后直到下一行带有“”的所有行 示例:当文件1的字段1和字段4分别为2776和2968时,应针对文件2的字段4搜索这些字段,以最终找到匹配的2776-2968(+)(因为文件1的两个数字都与文件2的字段4中的子字符串匹配)。字符串中数字的顺序无关紧要-2968-2776(+)也应视为匹配。因为它们匹配,所以会打印文件2的

目标:当文件1的字段1(
$1
)和字段4(
$4
)都与文件2中以“
”开头的行中字段4(
$4
)中的子字符串匹配时,打印文件2的行

重要注意事项#1:要打印输出的行包括要搜索的行以及在它之后直到下一行带有“
”的所有行

示例:当文件1的字段1和字段4分别为
2776
2968
时,应针对文件2的字段4搜索这些字段,以最终找到匹配的
2776-2968(+)
(因为文件1的两个数字都与文件2的字段4中的子字符串匹配)。字符串中数字的顺序无关紧要-
2968-2776(+)
也应视为匹配。因为它们匹配,所以会打印文件2的该行及其下的所有行,直到遇到另一行带有“
”为止

重要注意事项#2:文件1以制表符分隔:
\t
。文件2以冒号分隔:


文件1:

Transcription_Start     Translation_Start       Translation_Stop        Transcription_Stop      Strand  Expression
2776                    2968    +       920
17374                   17563   +       1959
2968                    2786    -       802
17563                   17375   -       1694
19606                   19395   -       1914
>-::NC_013316.1:2776-2968(+)
ATTGAACGCTGGCGGCAGGCCTAACACATGCAAGTCGAGCGGTAGAGAGAAGCTTGCTTC
TCTTGAGAGCGGCGGACGGGTGAGTAATGCCTAGGAATCTGCCTGGTAGTGGGGGATAAC
GCTCGGAAACGGACGCTAATACCGCATAC
>-::NC_013316.1:17374-17563(+)
AAAATTAAAGAAAATTCTAAAAAAATAAAAGATAGAATTTCAATTAAGTAAAAAAGTGAA
>-::NC_013316.1:2786-2968(-)
GTTCCTCCTTGTCACTATTTTAAACAAATTCCTATTGATACACTAAAAGTATATTATTTC
>antisense_CDR20291_r27::NC_013316.1:10830-11707(-)
TATTTCTTGTTCCTTTTTTCAAGGACAAGTAAATAAATTAACCTACTGTTTAATTTTCAA
>antisense_CDR20291_r27::NC_013316.1:11814-11874(-)
TTCCTTTGAGTTTCACTCTTGCGAGCGTACTTCCCAGGCGGA
>-::NC_013316.1:2776-2968(+)
ATTGAACGCTGGCGGCAGGCCTAACACATGCAAGTCGAGCGGTAGAGAGAAGCTTGCTTC
TCTTGAGAGCGGCGGACGGGTGAGTAATGCCTAGGAATCTGCCTGGTAGTGGGGGATAAC
GCTCGGAAACGGACGCTAATACCGCATAC
>-::NC_013316.1:17374-17563(+)
AAAATTAAAGAAAATTCTAAAAAAATAAAAGATAGAATTTCAATTAAGTAAAAAAGTGAA
>-::NC_013316.1:2786-2968(-)
GTTCCTCCTTGTCACTATTTTAAACAAATTCCTATTGATACACTAAAAGTATATTATTTC
文件2:

Transcription_Start     Translation_Start       Translation_Stop        Transcription_Stop      Strand  Expression
2776                    2968    +       920
17374                   17563   +       1959
2968                    2786    -       802
17563                   17375   -       1694
19606                   19395   -       1914
>-::NC_013316.1:2776-2968(+)
ATTGAACGCTGGCGGCAGGCCTAACACATGCAAGTCGAGCGGTAGAGAGAAGCTTGCTTC
TCTTGAGAGCGGCGGACGGGTGAGTAATGCCTAGGAATCTGCCTGGTAGTGGGGGATAAC
GCTCGGAAACGGACGCTAATACCGCATAC
>-::NC_013316.1:17374-17563(+)
AAAATTAAAGAAAATTCTAAAAAAATAAAAGATAGAATTTCAATTAAGTAAAAAAGTGAA
>-::NC_013316.1:2786-2968(-)
GTTCCTCCTTGTCACTATTTTAAACAAATTCCTATTGATACACTAAAAGTATATTATTTC
>antisense_CDR20291_r27::NC_013316.1:10830-11707(-)
TATTTCTTGTTCCTTTTTTCAAGGACAAGTAAATAAATTAACCTACTGTTTAATTTTCAA
>antisense_CDR20291_r27::NC_013316.1:11814-11874(-)
TTCCTTTGAGTTTCACTCTTGCGAGCGTACTTCCCAGGCGGA
>-::NC_013316.1:2776-2968(+)
ATTGAACGCTGGCGGCAGGCCTAACACATGCAAGTCGAGCGGTAGAGAGAAGCTTGCTTC
TCTTGAGAGCGGCGGACGGGTGAGTAATGCCTAGGAATCTGCCTGGTAGTGGGGGATAAC
GCTCGGAAACGGACGCTAATACCGCATAC
>-::NC_013316.1:17374-17563(+)
AAAATTAAAGAAAATTCTAAAAAAATAAAAGATAGAATTTCAATTAAGTAAAAAAGTGAA
>-::NC_013316.1:2786-2968(-)
GTTCCTCCTTGTCACTATTTTAAACAAATTCCTATTGATACACTAAAAGTATATTATTTC
所需输出:

Transcription_Start     Translation_Start       Translation_Stop        Transcription_Stop      Strand  Expression
2776                    2968    +       920
17374                   17563   +       1959
2968                    2786    -       802
17563                   17375   -       1694
19606                   19395   -       1914
>-::NC_013316.1:2776-2968(+)
ATTGAACGCTGGCGGCAGGCCTAACACATGCAAGTCGAGCGGTAGAGAGAAGCTTGCTTC
TCTTGAGAGCGGCGGACGGGTGAGTAATGCCTAGGAATCTGCCTGGTAGTGGGGGATAAC
GCTCGGAAACGGACGCTAATACCGCATAC
>-::NC_013316.1:17374-17563(+)
AAAATTAAAGAAAATTCTAAAAAAATAAAAGATAGAATTTCAATTAAGTAAAAAAGTGAA
>-::NC_013316.1:2786-2968(-)
GTTCCTCCTTGTCACTATTTTAAACAAATTCCTATTGATACACTAAAAGTATATTATTTC
>antisense_CDR20291_r27::NC_013316.1:10830-11707(-)
TATTTCTTGTTCCTTTTTTCAAGGACAAGTAAATAAATTAACCTACTGTTTAATTTTCAA
>antisense_CDR20291_r27::NC_013316.1:11814-11874(-)
TTCCTTTGAGTTTCACTCTTGCGAGCGTACTTCCCAGGCGGA
>-::NC_013316.1:2776-2968(+)
ATTGAACGCTGGCGGCAGGCCTAACACATGCAAGTCGAGCGGTAGAGAGAAGCTTGCTTC
TCTTGAGAGCGGCGGACGGGTGAGTAATGCCTAGGAATCTGCCTGGTAGTGGGGGATAAC
GCTCGGAAACGGACGCTAATACCGCATAC
>-::NC_013316.1:17374-17563(+)
AAAATTAAAGAAAATTCTAAAAAAATAAAAGATAGAATTTCAATTAAGTAAAAAAGTGAA
>-::NC_013316.1:2786-2968(-)
GTTCCTCCTTGTCACTATTTTAAACAAATTCCTATTGATACACTAAAAGTATATTATTTC

这就是我迄今为止所尝试的(它输出File2的全部内容,因此无法生成所需的输出):


如何使用awk(或类似工具)处理文件以实现我的目标?

对于您展示的示例,请尝试以下内容。使用GNU
awk
编写和测试

awk '
FNR==NR{
  arr[$1,$2]
  next
}
/^>/{
  found=""
  if((($5,$6) in arr) || (($6,$5) in arr)){
    found=1
  }
}
found
' file1 FS=":|-|\\\\("  file2
说明:添加上述内容的详细说明

awk '                             ##Starting awk program from here.
FNR==NR{                          ##Checking condition which will be TRUE when file1 is being read.
  arr[$1,$2]                      ##Creating arr with index of 1st and 2nd field.
  next                            ##next will skip all further statements from here.
}
/^>/{                             ##Checking condition if line starts from > then do following.
  found=""                        ##Nullifying found here.
  if((($5,$6) in arr) || (($6,$5) in arr)){  ##Checking condition if either 5th 6th field is present in arr OR 6th 5th field as a key present in arr then do following.
    found=1                       ##Setting found to 1 here.
  }
}
found                             ##Checking condition if found is set then print that line.
' file1 FS=":|-|\\\\("  file2     ##Mentioning Input_file(s) and setting field separator before Input_file2 to get exact values to match.

有了您展示的样品,请尝试以下内容。使用GNU
awk
编写和测试

awk '
FNR==NR{
  arr[$1,$2]
  next
}
/^>/{
  found=""
  if((($5,$6) in arr) || (($6,$5) in arr)){
    found=1
  }
}
found
' file1 FS=":|-|\\\\("  file2
说明:添加上述内容的详细说明

awk '                             ##Starting awk program from here.
FNR==NR{                          ##Checking condition which will be TRUE when file1 is being read.
  arr[$1,$2]                      ##Creating arr with index of 1st and 2nd field.
  next                            ##next will skip all further statements from here.
}
/^>/{                             ##Checking condition if line starts from > then do following.
  found=""                        ##Nullifying found here.
  if((($5,$6) in arr) || (($6,$5) in arr)){  ##Checking condition if either 5th 6th field is present in arr OR 6th 5th field as a key present in arr then do following.
    found=1                       ##Setting found to 1 here.
  }
}
found                             ##Checking condition if found is set then print that line.
' file1 FS=":|-|\\\\("  file2     ##Mentioning Input_file(s) and setting field separator before Input_file2 to get exact values to match.

非常感谢。这非常有效,你的详细解释真的帮助我理解发生了什么。它也可以快速高效地处理非常大的数据集。希望我能不止一次地+1。@Gawain,你的欢迎,你的好话对我来说也像++:)干杯,快乐学习,不断发布好问题(你的努力偏离了轨道),并不断分享干杯:)任何试图修改此脚本的人的快速注意:我最近注意到它只适用于以“
-
”,而不是“
>反义[[:alnum:]
”,因为“
-
“在awk脚本中设置为字段分隔符。解决此问题的一种方法是简单地运行此脚本的另一个迭代,但将每个
$5
替换为
$4
,将每个
$6
替换为
$5
。谢谢!这非常有效,你的详细解释真的帮助我理解发生了什么。它也可以快速高效地处理非常大的数据集。希望我能不止一次地+1。@Gawain,你的欢迎,你的好话对我来说也像++:)干杯,快乐学习,不断发布好问题(你的努力偏离了轨道),并不断分享干杯:)任何试图修改此脚本的人的快速注意:我最近注意到它只适用于以“
-
”,而不是“
>反义[[:alnum:]
”,因为“
-
”在awk脚本中设置为字段分隔符。解决此问题的一种方法是简单地运行此脚本的另一个迭代,但将每个
$5
替换为
$4
,将每个
$6
替换为
$5