awk复制具有多个条件的列

时间:2015-12-23 12:30:31

标签: awk conditional-statements

我正在尝试比较两个不同文件中的列(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也没有第一列。有没有人知道如何做到这一点?

4 个答案:

答案 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中的行而不提供额外信息