Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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_Conditional Statements - Fatal编程技术网

awk复制具有多个条件的列

awk复制具有多个条件的列,awk,conditional-statements,Awk,Conditional Statements,我试图比较两个不同文件中的列(第一个来自proba2.dat,第二个来自proba1.dat),例如 如果它们在区间0.05内匹配,那么我想将第三列添加到proba1.dat中,第二列的值来自proba2.dat,以便 proba3.dat 1 -3.56 0.030 2 -3.40 0.259 3 -3.12 0.086 4 -3.04 0.084 5 -3.11 0.086 6 -3.22 0.104 我试过了 awk 'FNR == NR { k[$2] = 1; next } { if

我试图比较两个不同文件中的列(第一个来自
proba2.dat
,第二个来自
proba1.dat
),例如

如果它们在区间0.05内匹配,那么我想将第三列添加到
proba1.dat
中,第二列的值来自
proba2.dat
,以便

proba3.dat
1 -3.56 0.030
2 -3.40 0.259
3 -3.12 0.086
4 -3.04 0.084
5 -3.11 0.086
6 -3.22 0.104
我试过了

awk 'FNR == NR { k[$2] = 1; next } { if (k[$1] <= 1+0.025 && k[$1] >= 1-0.025) { print $0 } }' \proba1.dat proba2.dat > proba3.dat
而且
proba1.dat
中没有第1列。有人知道如何做到这一点吗?

这对我很有用:

awk 'FNR==NR{a[$1]=$2} 
     FNR!=NR{for(i in a){if($2>=i-0.025&&$2<=i+0.025){$3=a[i];print;next}}}' \
       proba2.dat proba1.dat
awk'FNR==NR{a[$1]=2}

FNR=NR{for(i in a){if($2>=i-0.025&&$2让我们编写一个小函数,将数字四舍五入到最接近的5:

function myround(val) {
    n=int(val*100)
    nearest=sprintf("%.0f", n/5)
    near5=nearest*5
    return sprintf("%.2f", near5/100)
}
然后,循环第二个文件存储其值,然后循环第一个文件查找最接近的值:

awk 'FNR==NR {a[$1]=$2; next} {print $0, a[myround($2)]}' f2 f1
总而言之:

awk 'function myround(val) {
       n=int(val*100)
       nearest=sprintf("%.0f", n/5)
       near5=nearest*5
       return sprintf("%.2f", near5/100)
}
FNR==NR {a[$1]=$2; next} {print $0, a[myround($2)]}' f2 f1
它返回:

1 -3.56 0.030
2 -3.40 0.259
3 -3.12 0.086
4 -3.04 0.084
5 -3.11 0.086
6 -3.22 0.104

按逻辑顺序读取文件

awk 'FNR==NR{L[++s]=$0;M[s]=$2;next}{for(i=1;i<=s;i++)if(sqrt(($1-M[i])^2)<=0.025)L[i]=L[i] " " $2}END{for(i=1;i<=s;i++)print L[i]}' proba1.dat proba2.dat > proba3.dat

awk'FNR==NR{L[++s]=$0;M[s]=$2;next}{for(i=1;iYou需要将
proba2.dat
中的每一行与
proba1.dat
中的每一行匹配?您需要一个循环。您还需要将整个输入行保存在awk脚本的列值下(希望它们是唯一的)所以你可以把它们拿回来。首先处理第二个文件可能是有意义的。是的,你是对的。我错过了。注意你也可以说
FNR==NR{things;next}
,这样你就不必说
FNR!=NR
,只需说
{for(我在a中)}
1 -3.56 0.030
2 -3.40 0.259
3 -3.12 0.086
4 -3.04 0.084
5 -3.11 0.086
6 -3.22 0.104
awk 'NR==FNR{a[$1]=$2;next}{b=$2;sub(".$",/[0-4]$/?"0":"5");print $1,b,a[$2]}' proba2.dat proba1.dat
1 -3.56 0.030
2 -3.40 0.259
3 -3.12 0.086
4 -3.04 0.080
5 -3.11 0.086
6 -3.22 0.104
awk 'FNR==NR{L[++s]=$0;M[s]=$2;next}{for(i=1;i<=s;i++)if(sqrt(($1-M[i])^2)<=0.025)L[i]=L[i] " " $2}END{for(i=1;i<=s;i++)print L[i]}' proba1.dat proba2.dat > proba3.dat
awk 'FNR==NR{V[$1]=$2;next}{for(v in V)if(sqrt(($2-v)^2)<=0.025){print $0 " " V[v];next}print}' proba2.dat proba1.dat > proba3.dat