在bash中读取一行内容

在bash中读取一行内容

我有一个文件,其内容按此顺序排列,并以空格分隔

  4096 1230 4560 1024.... n

我如何读取每个数字并将其传递给另一个命令,例如将每个数字除以 1024。

答案1

当被标记时最简单的是将read其放入数组中:

bash-4.1$ read -a l < file

然后你可以像这样迭代这些值:

bash-4.1$ for n in "${l[@]}"; do echo "$n / 1024 ≈ $((n/1024)) = $(bc -l<<<"$n/1024")"; done
4096 / 1024 ≈ 4 = 4.00000000000000000000
1230 / 1024 ≈ 1 = 1.20117187500000000000
4560 / 1024 ≈ 4 = 4.45312500000000000000
1024 / 1024 ≈ 1 = 1.00000000000000000000

答案2

只要数据以空格分隔,您就可以将文件的内容加载到数组中,如下所示:

arr=$(< data.txt)

将数据加载到数组后,$arr您可以使用for循环来遍历它,并除以 1024。

$ for num in ${arr[*]}; do 
    res=$( expr $num / 1024 )
    echo "$num / 1024 = $res"
  done

例子

$ for num in ${arr[*]}; do res=$( expr $num / 1024 ); echo "$num / 1024 = $res";done
4096 / 1024 = 4
1230 / 1024 = 1
4560 / 1024 = 4
1024 / 1024 = 1

如果您想获得浮点结果而不是整数,您可以使用bc以下方法来执行此操作:

$ for num in ${arr[*]}; do 
    res=$(echo "scale=2; $num/1024" |bc)
    echo "$num / 1024 = $res"
  done
4096 / 1024 = 4.00
1230 / 1024 = 1.20
4560 / 1024 = 4.45
1024 / 1024 = 1.00

您可以通过更改传递给 的值来控制小数位数scale=。环境`scale=5

4096 / 1024 = 4.00000
1230 / 1024 = 1.20117
4560 / 1024 = 4.45312
1024 / 1024 = 1.00000

参考

答案3

shell 脚本的要点是运行尽可能少的命令。这里,awk通常是最适合将行分割成字段并进行算术运算的命令:

awk '{for (i = 1; i<= NF; i++) $i = $i/1024; print}' < your-file

在 shell 中使用 shell 循环通常是 shell 脚本编写实践不良的标志。

答案4

对于大型列表,我通常构建一个计数器来一次撕掉一行,然后您想要执行的任何变量操作都可以可靠地完成..我有大型数组(用于行 in cat foo.bar; do )去碎片..To机智:

InCt=`cat foo.bar|wc -l`
RunCt=1
while [ $InCt -ge $RunCt ]; do
  LINE=`head -${RunCt} foo.bar|tail -1`

  # do whatever you need with the line

let RunCt="$RunCt +1"
done

相关内容