Awk根据另一个文件中的匹配和条件更新文件
下面的Awk根据另一个文件中的匹配和条件更新文件,awk,Awk,下面的awk将生成选项卡删除的文件1,其中$3-$2之间的差异为每行计算并以$6打印。在执行awk之前,仅存在5个字段 如果file2的$1值与file1中的$5和file1中的$6的intron不匹配,我在用file1的$7值更新$2中遇到的问题。如果$5的值为intron,则文件1中$7的值为零。例如,file1中的第1行是intron,因此等于零或跳过(计算中不需要这些行) file2中的$1值可能不存在于file1中,在这种情况下file2中的$2值为零。file2中的第3行就是一个例子
awk
将生成选项卡删除的文件1
,其中$3-$2
之间的差异为每行计算并以$6
打印。在执行awk
之前,仅存在5个字段
如果file2
的$1
值与file1
中的$5
和file1
中的$6
的intron
不匹配,我在用file1
的$7
值更新$2
中遇到的问题。如果$5
的值为intron
,则文件1
中$7
的值为零。例如,file1
中的第1行是intron
,因此等于零或跳过(计算中不需要这些行)
file2
中的$1
值可能不存在于file1
中,在这种情况下file2
中的$2
值为零。file2
中的第3行就是一个例子,它被设置为零,因为它在file1
中不存在。谢谢:)
带输出的Awk
awk '
FNR==NR{ # process same line
b[$4]=$3-$2;
next # process next line
}
{
a[$5]+=($3-$2)
}
{
split($1, b, " "); print b[0], a[b[0]]
}' OFS="\t" file1 file2
-2135
-2135
-2222
-2351
-2351
-2414
输出
awk '
FNR==NR{ # process same line
b[$4]=$3-$2;
next # process next line
}
{
a[$5]+=($3-$2)
}
{
split($1, b, " "); print b[0], a[b[0]]
}' OFS="\t" file1 file2
-2135
-2135
-2222
-2351
-2351
-2414
文件1制表符分隔
chr5 86667863 86667879 RASA1 intron 16
chr5 86669977 86669995 RASA1 splicing 18
chr5 86670703 86670805 RASA1 exon 102
chr5 86679453 86679547 RASA1 intron 94
chr5 86679571 86679673 RASA1 exon 102
chr19 15088950 15088961 NOTCH2 intron 50
chr19 15288950 15288961 NOTCH3 intron 11
chr19 15308240 15308275 NOTCH3 exon 35
RASA1 2135
NOTCH2 0
GIMAP8 87
NOTCH3 129
FOXF2 0
PRB3 63
RASA1 222 `(102+102+18)`
NOTCH2 0
GIMAP8 0
NOTCH3 35 `(35)`
FOXF2 0
PRB3 0
文件2空格分隔
chr5 86667863 86667879 RASA1 intron 16
chr5 86669977 86669995 RASA1 splicing 18
chr5 86670703 86670805 RASA1 exon 102
chr5 86679453 86679547 RASA1 intron 94
chr5 86679571 86679673 RASA1 exon 102
chr19 15088950 15088961 NOTCH2 intron 50
chr19 15288950 15288961 NOTCH3 intron 11
chr19 15308240 15308275 NOTCH3 exon 35
RASA1 2135
NOTCH2 0
GIMAP8 87
NOTCH3 129
FOXF2 0
PRB3 63
RASA1 222 `(102+102+18)`
NOTCH2 0
GIMAP8 0
NOTCH3 35 `(35)`
FOXF2 0
PRB3 0
文件2更新后所需的输出
chr5 86667863 86667879 RASA1 intron 16
chr5 86669977 86669995 RASA1 splicing 18
chr5 86670703 86670805 RASA1 exon 102
chr5 86679453 86679547 RASA1 intron 94
chr5 86679571 86679673 RASA1 exon 102
chr19 15088950 15088961 NOTCH2 intron 50
chr19 15288950 15288961 NOTCH3 intron 11
chr19 15308240 15308275 NOTCH3 exon 35
RASA1 2135
NOTCH2 0
GIMAP8 87
NOTCH3 129
FOXF2 0
PRB3 63
RASA1 222 `(102+102+18)`
NOTCH2 0
GIMAP8 0
NOTCH3 35 `(35)`
FOXF2 0
PRB3 0
可能在第一个awk
之后添加一个|
,使用:
awk 'FNR==NR { a[$1]=$7; next } { if(a[$5]){$1=a[$5] }; print }'
要更新file2
如果我理解正确,这应该可以满足您的期望
$ awk 'FNR==NR && $5!="intron" {a[$4]+=$3-$2; next}
{$2=($1 in a)?a[$1]:0}1' file1 file2 > file2.updated
如果我理解正确的话,这应该能满足你的期望
$ awk 'FNR==NR && $5!="intron" {a[$4]+=$3-$2; next}
{$2=($1 in a)?a[$1]:0}1' file1 file2 > file2.updated
你能试试下面的吗。它将提供与输入文件顺序相同的输出顺序
awk '
FNR==NR{
if(!b[$1]++){
c[++count]=$1
}
a[$1]
next
}
($4 in a) && $5!="intron"{
a[$4]+=$NF
}
END{
for(i=1;i<=count;i++){
print c[i],a[c[i]]?a[c[i]]:0
}
}' Input_file2 Input_file1
你能试试下面的吗。它将提供与输入文件顺序相同的输出顺序
awk '
FNR==NR{
if(!b[$1]++){
c[++count]=$1
}
a[$1]
next
}
($4 in a) && $5!="intron"{
a[$4]+=$NF
}
END{
for(i=1;i<=count;i++){
print c[i],a[c[i]]?a[c[i]]:0
}
}' Input_file2 Input_file1
不要将数组的索引设置为FNR
,而是将其设置为$4
,并根据$3-$2
计算的结果将存储在该索引处数组中的值递增。像a[$5]+=($3-$2)
那么在处理第二个文件时,您可以从数组中的索引处提取与$1
中的第一个字符串匹配的项,像{split($1,b,”);打印b[0],a[b[0]
(如果语法不是100%,请原谅,但这应该是大概的。我做了编辑,认为我没有遵循,但在原始帖子中包含了输出。谢谢:)。而不是将数组的索引设置为FNR
将其设置为$4
,并根据$3-$2
计算的结果增加存储在该索引处数组中的值。如a[$5]+=($3-$2)
然后在处理第二个文件时,您只需从数组中的索引处提取与$1
中的第一个字符串匹配的项,就像{split($1,b,”);打印b[0],a[b[0]
(如果语法不是100%,请原谅,但这应该是大概的。我做了编辑,不认为我遵循了,但在原始帖子中包含了输出。谢谢:)。IMHO karafka先生,IMHO,我认为OP提到它是错误的,根据显示的示例,输入文件的字段1是第四位。非常感谢你们:).IMHO karafka先生,IMHO,我认为OP提到它是错误的,因为输入文件1中显示的示例字段是第4个。非常感谢两位:)。