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

目标:当 File1 的字段 1 ( $1) 和字段 4 ( $4)与File2 中$4以 " >"开头的行上的字段 4 ( )中的子字符串匹配时,打印 File2 的行。

重要提示#1:打印到输出的行包括正在搜索的行它后面的所有行,直到下一行带有>”。

示例:当File1 的字段 1 和 4分别为2776& 时2968,应针对 File2 的字段 4 搜索它们以最终找到匹配项2776-2968(+)(因为File1 的两个数字都匹配 File2 的字段 4 中的子字符串)。字符串中数字的顺序无关紧要 -2968-2776(+)也应视为匹配。因为它们匹配,所以 File2 的那一行被打印在它下面的所有行,直到>遇到另一行带有“ ”。

重要说明#2: File1 是制表符分隔的: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

文件2:

>-::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 -F"t|:" 'NR==FNR{a[$4]; next} ($1 in a) || ($4 in a)' File1 File2 > Output
>-::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

如何使用 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.


以上是当file1中的两个字段匹配file2中单个字段的子字符串时打印file2的行的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>