我有两个文件:
文件-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
相同的行数),这都可以正常工作。