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