Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk根据另一个文件中的匹配和条件更新文件_Awk - Fatal编程技术网

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个。非常感谢两位:)。