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,请在你的帖子中更改你的预期输出,然后让我知道。