我有两个文件:
文件-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中)将生成如下所示的输出:
$ 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
$

注意,因为这会在从第二个文件读取任何内容之前将第一个文件的全部内容存入内存,所以输入文件不应该太大(比如说亚千兆字节大小)。如果他们比这更大,你可能应该设计一个替代策略。
例如,有一个so-25657951.sh函数(即使在POSIXgetline中)可用于从文件2中为文件1中的每一行读取一行,然后您可以简单地打印数据而无需累积任何内容:
awk '{ getline add < "file-2"; $3 += add; print }' file-1

对于任何大小的文件(只要文件具有相同的行数,或者更准确地说,只要awk具有至少与file-2相同的行数),这都可以正常工作。

07-24 09:35
查看更多