我想使用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
答案 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
。