awk根据两个文件中3个字段的匹配情况更新文件

awk根据两个文件中3个字段的匹配情况更新文件,awk,Awk,试图使用awk在file1数组x中存储$5的值。然后,该数组x用于搜索file1的$4,以找到匹配项(我使用x[2]跳过file1中的标题)。由于$4中可以有多个字符串,这些字符串由,(逗号)分隔,因此我将它们拆分,并在每个拆分中迭代寻找匹配项。然后将每个分割存储在数组中,并与x[2]进行比较以获得匹配。在下面的示例中,所有$4值都是matc,但情况并非总是如此。模式c.从每个匹配的$4中提取并存储为VAL。下面的awk有望做到这一点,但我正在努力的是更新file1中的$6,而$2和$3以及数组

试图使用
awk
file1
数组
x
中存储
$5
的值。然后,该数组
x
用于搜索
file1
$4
,以找到匹配项(我使用x[2]跳过file1中的标题)。由于
$4
中可以有多个字符串,这些字符串由
(逗号)分隔,因此我将它们拆分,并在每个拆分中迭代寻找匹配项。然后将每个分割存储在数组中,并与
x[2]
进行比较以获得匹配。在下面的示例中,所有
$4
值都是matc,但情况并非总是如此。模式
c.
从每个匹配的
$4
中提取并存储为
VAL
。下面的
awk
有望做到这一点,但我正在努力的是更新
file1
中的
$6
,而
$2
$3
以及数组值必须与
file2
中的
$4
$5
$6
匹配。如果这是真的,那么
file1
中的
$6
将使用
file2
中的
$1
$2
的值进行更新。第4行就是一个例子,因为
NM_000138.4
匹配数组
x[2]
,并且
c.
值与
(冒号)匹配
文件2中的
$6
。因此,在
file1
中更新
$6
满足所有条件。第2行满足除
c以外的所有要求。
VAL
中的
值与
file2
中的
$6
不匹配,因此
file1
不会更新。我希望这是一个好的开始,我没有把事情搞得太复杂(尽管我可能有,也许还有更好的方法)。我没有测试过
awk
,但将其作为一个陈述点,并对我的想法进行了评论。谢谢:)

文件1
制表符分隔

R_Index Chr Start   AAChange.refGeneWithVer MajorTranscript HGMD C1 C2
1   chr15   48720526    FBN1:NM_000138.4:exon57:c.6997+17C>G:p.?    NM_000138.4 . . .
2   chr15   48741091    FBN1:NM_000138.4:exon46:c.5546-1G>A:p.? NM_000138.4 . . .
3   chr15   48807637    FBN1:NM_000138.4:exon12:c.1415G>A:p.Cys472Tyr   NM_000138.4 . . .
4   chr15   48741091    FBN1:NM_000138.4:exon46:c.5546-1G>A:p.?,FBN1:NM_000138.4:exon46:c.5546-1G>T:p.? NM_000138.4 . . .
HGMD ID Class   Gene Symbol chromosome  start   hgvs
CS057007    DM  FBN1    chr15   48797346    c.1838-2A>G
CS057008    DM  FBN1    chr15   48741091    c.5546-1G>T
R_Index Chr Start   AAChange.refGeneWithVer MajorTranscript HGMD C1 C2
1   chr15   48720526    FBN1:NM_000138.4:exon57:c.6997+17C>G:p.?    NM_000138.4 . . .
2   chr15   48741091    FBN1:NM_000138.4:exon46:c.5546-1G>A:p.? NM_000138.4 . . .
3   chr15   48807637    FBN1:NM_000138.4:exon12:c.1415G>A:p.Cys472Tyr   NM_000138.4 . . .
4   chr15   48741091    FBN1:NM_000138.4:exon46:c.5546-1G>A:p.?,FBN1:NM_000138.4:exon46:c.5546-1G>T:p.? NM_000138.4 CS057008 DM . .
文件2
制表符分隔

R_Index Chr Start   AAChange.refGeneWithVer MajorTranscript HGMD C1 C2
1   chr15   48720526    FBN1:NM_000138.4:exon57:c.6997+17C>G:p.?    NM_000138.4 . . .
2   chr15   48741091    FBN1:NM_000138.4:exon46:c.5546-1G>A:p.? NM_000138.4 . . .
3   chr15   48807637    FBN1:NM_000138.4:exon12:c.1415G>A:p.Cys472Tyr   NM_000138.4 . . .
4   chr15   48741091    FBN1:NM_000138.4:exon46:c.5546-1G>A:p.?,FBN1:NM_000138.4:exon46:c.5546-1G>T:p.? NM_000138.4 . . .
HGMD ID Class   Gene Symbol chromosome  start   hgvs
CS057007    DM  FBN1    chr15   48797346    c.1838-2A>G
CS057008    DM  FBN1    chr15   48741091    c.5546-1G>T
R_Index Chr Start   AAChange.refGeneWithVer MajorTranscript HGMD C1 C2
1   chr15   48720526    FBN1:NM_000138.4:exon57:c.6997+17C>G:p.?    NM_000138.4 . . .
2   chr15   48741091    FBN1:NM_000138.4:exon46:c.5546-1G>A:p.? NM_000138.4 . . .
3   chr15   48807637    FBN1:NM_000138.4:exon12:c.1415G>A:p.Cys472Tyr   NM_000138.4 . . .
4   chr15   48741091    FBN1:NM_000138.4:exon46:c.5546-1G>A:p.?,FBN1:NM_000138.4:exon46:c.5546-1G>T:p.? NM_000138.4 CS057008 DM . .
所需输出
制表符分隔

R_Index Chr Start   AAChange.refGeneWithVer MajorTranscript HGMD C1 C2
1   chr15   48720526    FBN1:NM_000138.4:exon57:c.6997+17C>G:p.?    NM_000138.4 . . .
2   chr15   48741091    FBN1:NM_000138.4:exon46:c.5546-1G>A:p.? NM_000138.4 . . .
3   chr15   48807637    FBN1:NM_000138.4:exon12:c.1415G>A:p.Cys472Tyr   NM_000138.4 . . .
4   chr15   48741091    FBN1:NM_000138.4:exon46:c.5546-1G>A:p.?,FBN1:NM_000138.4:exon46:c.5546-1G>T:p.? NM_000138.4 . . .
HGMD ID Class   Gene Symbol chromosome  start   hgvs
CS057007    DM  FBN1    chr15   48797346    c.1838-2A>G
CS057008    DM  FBN1    chr15   48741091    c.5546-1G>T
R_Index Chr Start   AAChange.refGeneWithVer MajorTranscript HGMD C1 C2
1   chr15   48720526    FBN1:NM_000138.4:exon57:c.6997+17C>G:p.?    NM_000138.4 . . .
2   chr15   48741091    FBN1:NM_000138.4:exon46:c.5546-1G>A:p.? NM_000138.4 . . .
3   chr15   48807637    FBN1:NM_000138.4:exon12:c.1415G>A:p.Cys472Tyr   NM_000138.4 . . .
4   chr15   48741091    FBN1:NM_000138.4:exon46:c.5546-1G>A:p.?,FBN1:NM_000138.4:exon46:c.5546-1G>T:p.? NM_000138.4 CS057008 DM . .
awk

awk '
BEGIN { FS=OFS="\t" }
  FNR==NR {x[NR]=$5}  # store value in $5 in array x 
  $4 ~ x[2] {      # if $4 matches x[2]
  match($4,"NM"].*],);  # regex match from NM to till , in 4rd field
   val=substr($4,RSTART+1,RLENGTH-2); # store substring value that starts from RSTART+1 to RLENGTH-2 using $4 in val
   NM=split($4, array,",");   # Split $4 on "," and storing it's length(array's length) to variable named num. 
      for(i=1;i<=NM;i++){ # Starting a loop which will start from value 1 of variable i to till value of variable num
       if(array[i] ~  x[2]){  # Check condition if any array's value is equal to array x[2] skipping header
       if (match(NM[i],/c[.].:/)) {  # extract pattern c. in each split from c. to :
       VAL=substr(NM[n],RSTART+2) # store each c. from split in VAL
          }
         }
        }
       }
   {a[$4,$5,$6]=$1,$2; next} a[$2,$3]{$6=a[$2,$3]}1' file1 file2  # update $6 in file1 if condition is met
awk'
开始{FS=OFS=“\t”}
FNR==NR{x[NR]=$5}#将值存储在数组x中的$5中
$4~x[2]{#如果$4匹配x[2]
匹配($4,“NM”].*);#正则表达式在第4个字段中从NM到till进行匹配
val=substr($4,RSTART+1,RLENGTH-2)#在val中使用$4存储从RSTART+1到RLENGTH-2的子字符串值
NM=split($4,数组,“,”);#在“,”上拆分$4,并将其长度(数组的长度)存储到名为num的变量。

对于(i=1;i您可以尝试以下内容,并让我知道这是否对您有帮助

awk 'FNR==NR{a[$NF]=$1 OFS $2;next} {split($4,array,":");for(i in array){if(array[i] in a){print $0,a[array[i]];next}}} 1' Input_file2 Input_file1
现在也添加了一个非一行格式

awk '
FNR==NR{
  a[$NF]=$1 OFS $2;
  next}
{
  split($4,array,":");
  for(i in array){
    if(array[i] in a){
      print $0,a[array[i]];
      next}}
}
1
'  Input_file2  Input_file1


awk 'FNR==NR{a[$NF]=$1 OFS $2;next} {split($4,array,":");for(i in array){if(array[i] in a){print $0,a[array[i]];next}}} 1'  Input_file2  Input_file1
R_Index Chr Start   AAChange.refGeneWithVer MajorTranscript HGMD C1 C2
1   chr15   48720526    FBN1:NM_000138.4:exon57:c.6997+17C>G:p.?    NM_000138.4 . . .
2   chr15   48741091    FBN1:NM_000138.4:exon46:c.5546-1G>A:p.? NM_000138.4 . . .
3   chr15   48807637    FBN1:NM_000138.4:exon12:c.1415G>A:p.Cys472Tyr   NM_000138.4 . . .
4   chr15   48741091    FBN1:NM_000138.4:exon46:c.5546-1G>A:p.?,FBN1:NM_000138.4:exon46:c.5546-1G>T:p.? NM_000138.4 . . . CS057008 DM

awk
有效,但是如何更新
$6
呢?在我的实际数据中,在
$6
之后有几个字段。谢谢:)@Chris,你能不能在你提到的内容上加上一个例子?对不起,没有得到它。为什么
打印$0,“C1”of“C2”
而不是
打印$0,“C1”,“C2”
?@Chris,你需要输出中的
C1
C2
,对吗?如果是的话,我以前的解决方案对你很有用。如果你有任何疑问,请在你的问题中说得更清楚。@Chris,请在你的帖子中更改你的预期输出,然后让我知道。