awk:匹配字段并将常数值插入矩阵

时间:2018-07-03 14:43:09

标签: awk

我想使用awk操作两个文件(t.dat和b.dat)。我取得了一些进展,但在step5有存货,我想将step4的$ 1,$ 2(tempb_a2.dat)与b.dat匹配,并将step4的$ 3写入b.dat来生成out.dat。这是我的代码:

    awk '!($3 <= -2000)' OFS="\t" t.dat > t_a2.dat      # step1
    awk '$3 >= -2000 {$3="100000"}1' t.dat > t_b2.dat   # step2
    awk 'FNR==NR {a[$1,$2]; next} ($1,$2) in a'  t_a2.dat b.dat > b_a2.dat  # step3
    awk '$3 > 0 {$3="100000"}1' b_a2.dat > tempb_a2.dat # ste4
                                    # step5: match $1,$2 of step4 with b.dat and replace $3 of b.dat with constant values
==> tempb_a2.dat <==
3173.31022404 0.999881782111 100000
3175.31041958 0.999881782111 100000
3176.31051735 0.999881782111 100000
3177.31061512 0.999881782111 100000
3179.31081066 0.999881782111 100000
3180.31090843 0.999881782111 100000
3182.31110397 0.999881782111 100000

==> b.dat <==
3173.31022404 0.999881782111 485.86
3174.31032181 0.999881782111 486.74
3175.31041958 0.999881782111 487.45
3176.31051735 0.999881782111 487.97
3177.31061512 0.999881782111 488.29
3178.31071289 0.999881782111 488.39
3179.31081066 0.999881782111 488.25
3180.31090843 0.999881782111 487.82
3181.3110062 0.999881782111 487.06
3182.31110397 0.999881782111 486.13

==> out.dat <==
3173.31022404 0.999881782111 100000
3174.31032181 0.999881782111 486.74
3175.31041958 0.999881782111 100000
3176.31051735 0.999881782111 100000
3177.31061512 0.999881782111 100000
3178.31071289 0.999881782111 488.39
3179.31081066 0.999881782111 100000
3180.31090843 0.999881782111 100000
3181.3110062 0.999881782111 487.06
3182.31110397 0.999881782111 100000

========================================
==> t.dat <==
3173.31022404 0.999881782111 -1832.86
3174.31032181 0.999881782111 -4097.18
3175.31041958 0.999881782111 -297.84
3176.31051735 0.999881782111 NaN
3177.31061512 0.999881782111 -1926.67
3178.31071289 0.999881782111 -4927.53
3179.31081066 0.999881782111 NaN
3180.31090843 0.999881782111 -1900.99
3181.3110062 0.999881782111 -4174.76
3182.31110397 0.999881782111 -1041.73

1 个答案:

答案 0 :(得分:1)

编辑: OP正在询问关于2个文件的第二个问题,所以现在也添加它。

awk 'FNR==NR{a[$1,$2]=$NF;next} {print $1,$2,a[$1,$2]?a[$1,$2]:$NF}' tempb_a2.dat b.dat > out.dat

根据您的评论,得到的是,如果是这种情况,那么您需要更改最后一个字段,这些字段的值要么为NaN,要么大于-2000,那么后面的内容可能会对您有所帮助。

awk '$NF=="NaN" || $NF>-2000{$NF=100000} 1' t.dat

说明:

$NF=="NaN" || $NF>-2000:在这里检查条件,如果最后一个字段($ NF)是字符串NaN或大于-2000,然后执行以下操作。

$NF=100000:将当前行的最后一个字段的值分配给100000

1:在这里提到1时,awk会先使用condition然后是action的方法,因此通过提及1使条件为TRUE而不是提及任何操作,因此默认情况下会打印当前行。

Input_file:在此提及输入文件名,我们需要将其传递给awk