如何使用 Bash 添加两个 txt 文件中的数字?

如何使用 Bash 添加两个 txt 文件中的数字?

我有一个 txt 文件,其中包含一些如下数字:

1  
2  
3  
4  
5  

我还有另一个 txt 文件,其中包含相同的行数,但包含其他数字:

6  
7   
8  
9  
10

我想将它们加在一起,即1+6、2+7、3+8等。我该如何编写脚本?

顺便说一句,到目前为止,我已经得到了各种各样的答案,直到我在我的文件上尝试过它们之后,我才意识到有些方法无法处理小数。我的一些文件包含小数,我需要准确,所以如果您想添加答案,您能否展示一种可以准确计算小数的方法。谢谢。

答案1

沿着这条paste线,但用以下方法进行数学计算bc

$ paste -d+ file1 file2 | bc
7
9
11
13
15

中间结果(之前bc):

$ paste -d+ file1 file2
1+6
2+7
3+8
4+9
5+10

对于更以 bash 为中心的解决方案,并假设 file2 至少具有与 file1 一样多的行:

mapfile -t file1 < file1
mapfile -t file2 < file2
for((i=0; i < ${#file1[@]}; i++))
do
  printf '%d\n' $((file1[i] + file2[i]))
done

...对于非整数,结合以下想法:

mapfile -t file1 < file1
mapfile -t file2 < file2
for((i=0; i < ${#file1[@]}; i++))
do
  printf '%d + %d\n' "${file1[0]}" "${file2[0]}" | bc
done

答案2

这是许多工具都可以解决的基本任务;paste+awk组合看起来特别方便:

$ paste file1 file2 | awk '{$0=$1+$2}1'
7
9
11
13
15

答案3

唯一awk的解决方案

awk '(getline a <"file2") <= 0 {exit}; {print $0 + a}' file1

答案4

好吧,这有点神秘,但也有 bash 算术,paste以及sed.

$ # debug
$ paste -d+ <(sed 's/\(.*\)/echo $((\1/' file1) <(sed 's/\(.*\)/\1))/' file2)
echo $((1+6))
echo $((2+7))
echo $((3+8))
echo $((4+9))
echo $((5+10))

$ eval "$(paste -d+ <(sed 's/\(.*\)/echo $((\1/' file1) <(sed 's/\(.*\)/\1))/' file2))"
7
9
11
13
15

相关内容