gpt4 book ai didi

linux - 如何在bash脚本中对不同文件的列求和

转载 作者:太空宇宙 更新时间:2023-11-04 08:58:48 25 4
gpt4 key购买 nike

我有两个文件:

文件-1

1  2  3  4  
1 2 3 4
1 2 3 4

文件-2

0.5  
0.5
0.5

现在我想将 file-2 的第 1 列添加到 file-1 的第 3 列

输出

1  2  3.5  4  
1 2 3.5 4
1 2 3.5 4

我已经试过了,但它不能正常工作:

awk '{print  $1, $2, $3+file-2 }'  file-2=$1_of_file-2 file-1 > file-3  

我知道 awk 语句不正确,但我想使用这样的东西;谁能帮我?

最佳答案

您的数据不是很令人兴奋……

awk 'FNR == NR { for (i = 1; i <= NF; i++) { line[NR,i] = $i } fields[NR] = NF }
FNR != NR { line[FNR,3] += $1
pad = ""
for (i = 1; i <= fields[FNR]; i++) { printf "%s%s", pad, line[FNR,i]; pad = " " }
printf "\n"
}' file-1 file-2

第一个模式匹配第一个文件中的行;它将每个字段保存到伪多维数组 line 中,并记录该行中有多少个字段。

第二个模式匹配第二个文件中的行;它将第一列中的值添加到保存数据的第三列,然后打印出所有字段,它们之间有一个空格,并在末尾添加一个换行符。

鉴于此(轻微)修改的输入,脚本(保存在文件 so-25657951.sh 中)产生如下所示的输出:

$ cat file-1
1 2 3 4
2 3 6 5
3 4 9 6
$ cat file-2
0.1
0.2
0.3
$ bash so-25657951.sh
1 2 3.1 4
2 3 6.2 5
3 4 9.3 6
$

请注意,因为这会在从第二个文件读取任何内容之前将第一个文件的整个内容拖入内存,所以输入文件不应太大(例如亚千兆字节大小)。如果它们比这更大,您可能应该设计一个替代策略。

例如,有一个 getline 函数(即使在 POSIX awk 中)可以用来从文件 2 中为文件 1 中的每一行读取一行,并且然后你可以简单地打印数据而不需要积累任何东西:

awk '{ getline add < "file-2"; $3 += add; print }' file-1

这对于任何大小的文件都相当干净(只要文件具有相同的行数——或者更准确地说,只要 file-2 的行数至少与file-1).

关于linux - 如何在bash脚本中对不同文件的列求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25657951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com