我正在尝试比较两个不同文件中的列(proba2.dat
中的第1列和proba1.dat
中的第2列),前
proba1.dat
1 -3.56
2 -3.40
3 -3.12
4 -3.04
5 -3.11
6 -3.22
proba2.dat
-3.00 0.080
-3.05 0.084
-3.10 0.086
-3.15 0.097
-3.20 0.104
-3.25 0.160
-3.30 0.230
-3.35 0.340
-3.40 0.259
-3.45 0.123
-3.50 0.033
-3.55 0.030
-3.60 0.012
如果它们在 0.05 的区间内匹配,那么我想将第3列添加到proba1.dat
,并使用proba2.dat
中第2列的值,以便我得到了
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
但它只打印完全匹配的值
-3.40 0.259
并且proba1.dat
也没有第一列。有没有人知道如何做到这一点?
答案 0 :(得分:2)
这对我有用:
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
FNR==NR
仅适用于第一个文件proba2.dat
a[$1]=$2
使用第一个字段作为索引并将第二个字段作为值填充数组a
。FNR!=NR
仅适用于第二个文件proba1.dat
for(i in a)
循环通过当前创建的数组a
。if($2>=i-0.025&&$2<=i+0.025
如果值在0.05 $3=a[i]
设置&#34; new&#34;索引在该范围内的第三个字段到该值。print;next
打印新行并继续下一行。答案 1 :(得分:0)
让我们写一个小函数来将数字四舍五入到最接近的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
答案 2 :(得分:0)
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
答案 3 :(得分:0)
按逻辑顺序读取文件
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
在这两个版本中,如果在proba2.dat中找不到对应关系,则打印proba1.dat中的行而不提供额外信息