shell BASH:对文件中的列执行小数除法,并在另一个文件中打印结果

lx0bsm1f  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(123)

我有一个文件(.txt格式),其中包含以下列:

# DM      Sigma      Time (s)     Sample    Downfact
78.20    7.36    134.200512    2096883      70
78.20    7.21    144.099904    2251561      70
78.20    9.99    148.872384    2326131     150
78.20   10.77    283.249664    4425776      45

我想编写一个bash脚本,将“Time”列中的所有值除以0.5867,得到最多2个小数点的精度,并在另一个文件out.txt中打印出结果值
我尝试使用bc/awk,但它给出此错误。

awk: cmd. line:1: fatal: division by zero attempted
awk: fatal: cannot open file `file' for reading (No such file or directory)

有人能帮我吗?谢谢。
这是我尝试的bash脚本:

cat in.txt | while read DM Sigma Time Sample Downfact; do
echo "$DM      $Sigma      $Time     $Sample    $Downfact"                                                                                            
pperiod = 0.5867                                                                                                                                                                                                                                                                                                         
awk -v n=$Time 'BEGIN {printf "%.2f\n", (n/$pperiod)}'                                                                                                  
#echo "scale=2 ; $Time / $pperiod" | bc                                                                                                                 
#echo "$subint" > out.txt                                                                                                                            
done

我希望脚本将列“Time”除以pperiod,得到精确到2位小数的结果。

mccptt67

mccptt671#

当前 awk 代码 存在 许多 问题 :

  • 需要 传入 $pperiod 变量 的 值
  • 需要 按 位置 引用 Time 列 ( 本 例 中 为 $3
  • BEGIN{} 块 在 处理 任何 输入 行 之前 应用 , 并且 与 实际 输入 行 的 处理 无关
  • 没有 代码 对 实际 输入 行 执行 处理
  • 我 需要 决定 在 divide by zero 场景 中 要 做 什么 ( 在 这种 情况 下 , 我们 将 默认 答案 为 0.00
      • 注意 : * * 当前 代码 生成 divide by zero 错误 , 因为 $pperiod 是 未 定义 得 ( awk ) 变量 , 而 该 变量 得 默认 值 为 0
  • 此外 , pperiod = 0.5867 是 无效 bash 语法

解决 当前 问题 的 一 个 想法 是 :

pperiod=0.5867 
awk -v pp="${pperiod}" 'NR>1 {printf "%.2f\n", (pp==0 ? 0 : ($3/pp))}' in.txt > out.txt

中 的 每 一 个
其中 :

  • -v pp="${pperiod}" - 将 bash 变量 "${pperiod}" 的 值 赋 给 awk 变量 pp
  • NR>1 - 跳过 标题 行
  • 第 一 个 问题 是 , 如果 你 想 在 一 个 时间 段 内 完成 一 个 任务 , 那么 你 必须 先 完成 一 个 任务 , 然后 再 完成 一 个 任务 。
  • (pp==0 ? 0 : ($3/pp)) - 如果 pp 等于 0 , 则 打印 0 , 否则 打印 $3/pp) 的 结果 ( 这 会 阻止 我们 生成 divide by zero error
      • 注意 : * * 这 也 消除 了 对 cat|while 循环 的 需要

这 会 产生 :

$ cat out.txt
228.74
245.61
253.75
482.78

格式

相关问题