修改一列但使用 awk 打印所有列

修改一列但使用 awk 打印所有列

我想用以下代码修改 $2:

cat file | awk '{printf "%.15f\n", $2 = 1-$2}' > new_file

该代码完成其工作,打印 15 位小数并计算 1-n。但是,它不会打印其他列。如果我尝试使用以下代码执行此操作,它会打印它,但打印到不同的行:

cat file | awk '{printf "%.15f\n", $2 = 1-$2; print $0}' > new_file

我的原始文件:

752566 0.883928571428571 1 rs3094315 0
752721 0.765873015873016 1 rs3131972 0
752894 0.883928571428571 1 rs3131971 0
753541 0.268849206349206 1 rs2073813 0

输出:

752566 0.116071 1 rs3094315 0
0.116071428571429

所需的输出(列的顺序无关紧要):

752566 1 rs3094315 0 0.116071428571429

答案1

您可以使用sprintf将新值打印到格式化字符串,并将其指定为 的新值$2

$2 = sprintf("%.15f",1-$2)

然后只需打印整个(修改后的)记录即可:

$ awk '{$2 = sprintf("%.15f",1-$2); print}' file
752566 0.116071428571429 1 rs3094315 0
752721 0.234126984126984 1 rs3131972 0
752894 0.116071428571429 1 rs3131971 0
753541 0.731150793650794 1 rs2073813 0

答案2

必须是awk吗?

$ cat in
752566 0.883928571428571 1 rs3094315 0
752721 0.765873015873016 1 rs3131972 0
752894 0.883928571428571 1 rs3131971 0
753541 0.268849206349206 1 rs2073813 0

$ perl -pe 's/(\d+\.\d+)/sprintf("%.15f", 1-$1)/e' < in
752566 0.116071428571429 1 rs3094315 0
752721 0.234126984126984 1 rs3131972 0
752894 0.116071428571429 1 rs3131971 0
753541 0.731150793650794 1 rs2073813 0

答案3

我们可以使用dc计算器命令。精度宽度存储在 $precsn 变量中,默认精度设置为 6。由于输出顺序不需要匹配,因此由于 dc 的 LiFO 性质,我们以相反的顺序打印。

precsn=15
sed -Ee 's/\S+/[&]/4' file |
dc -e "
${precsn:-6}k
[q]sq
[n32anz2<p]sp
[?z0=q lpx 1r-1/0 nn32an pcz0=?]s?
l?x
"
0 rs3094315 1 0.116071428571429 752566
0 rs3131972 1 0.234126984126984 752721
0 rs3131971 1 0.116071428571429 752894
0 rs2073813 1 0.731150793650794 753541

相关内容