我有一个文件,其内容按此顺序排列,并以空格分隔
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