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

Linux 如何在bash脚本中对不同文件的列求和,linux,bash,awk,Linux,Bash,Awk,我有两个文件: 文件-1 文件-2 现在我想将file-2的第1列添加到file-1的第3列 输出 我尝试过这个,但它不能正常工作: 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

我有两个文件:

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

输出 我尝试过这个,但它不能正常工作:

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
请注意,因为这会在从第二个文件中读取任何内容之前将第一个文件的整个文件读入内存,所以输入文件不应该太大(比如说亚千兆字节大小)。如果他们比这更大,你可能应该设计一个替代策略

例如,有一个
getline
函数(甚至在POSIX
awk
中),可用于从文件2中为文件1中的每一行读取一行,然后您可以简单地打印数据,而无需累积任何内容:

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

这对于任何大小的文件都非常有效(只要文件的行数相同,或者更准确地说,只要
file-2
的行数至少与
file-1
的行数相同)。

您的数据不是很令人兴奋

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
请注意,因为这会在从第二个文件中读取任何内容之前将第一个文件的整个文件读入内存,所以输入文件不应该太大(比如说亚千兆字节大小)。如果他们比这更大,你可能应该设计一个替代策略

例如,有一个
getline
函数(甚至在POSIX
awk
中),可用于从文件2中为文件1中的每一行读取一行,然后您可以简单地打印数据,而无需累积任何内容:

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

这对于任何大小的文件都非常有效(只要文件的行数相同,或者更准确地说,只要
file-2
的行数至少与
file-1
的行数相同)。

您的数据不是很令人兴奋

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
请注意,因为这会在从第二个文件中读取任何内容之前将第一个文件的整个文件读入内存,所以输入文件不应该太大(比如说亚千兆字节大小)。如果他们比这更大,你可能应该设计一个替代策略

例如,有一个
getline
函数(甚至在POSIX
awk
中),可用于从文件2中为文件1中的每一行读取一行,然后您可以简单地打印数据,而无需累积任何内容:

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

这对于任何大小的文件都非常有效(只要文件的行数相同,或者更准确地说,只要
file-2
的行数至少与
file-1
的行数相同)。

您的数据不是很令人兴奋

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
请注意,因为这会在从第二个文件中读取任何内容之前将第一个文件的整个文件读入内存,所以输入文件不应该太大(比如说亚千兆字节大小)。如果他们比这更大,你可能应该设计一个替代策略

例如,有一个
getline
函数(甚至在POSIX
awk
中),可用于从文件2中为文件1中的每一行读取一行,然后您可以简单地打印数据,而无需累积任何内容:

awk '{ getline add < "file-2"; $3 += add; print }' file-1
awk'{getline add<“file-2”$3+=add;print}file-1
这对于任何大小的文件都能合理地工作(只要文件的行数相同,或者更准确地说,只要
file-2
的行数至少与
file-1
的行数相同)。

这可能会起作用:

cat f1
1 2 3 4
2 3 6 5
3 4 9 6 
在我发布后,我确实看到它与Jaypal在评论中发布的内容相同。

这可能有用:

cat f1
1 2 3 4
2 3 6 5
3 4 9 6 
在我发布后,我确实看到它与Jaypal在评论中发布的内容相同。

这可能有用:

cat f1
1 2 3 4
2 3 6 5
3 4 9 6 
在我发布后,我确实看到它与Jaypal在评论中发布的内容相同。

这可能有用:

cat f1
1 2 3 4
2 3 6 5
3 4 9 6 


在我发布后,我确实看到它与Jaypal在评论中发布的内容相同。

你可以像
粘贴文件1文件2 | awk'{print$1,$2,($3+$5),$4}>file3
在发布问题后,我想到了这个想法,谢谢你的建议。你可以像
粘贴文件1文件2 | awk'{print$1,$2,($3+$5),$4}“>file3
发布问题后,我想到了这个想法,谢谢你的建议。你可以像
粘贴file1 file2|awk'{print$1,$2,($3+$5),$4}>file3
发布问题后,我想到了这个想法,谢谢你的建议。你可以像
粘贴file1 file2|awk'{print$1,$2,($3+$5),$4}”“>file3
发布问题后,我想到了这个想法,谢谢你的建议。这不是我的实际数据,我实际上是在尝试将一种金属的POSCAR类型文件转换为另一种。在我的新文件中,原子之间的距离与前一个文件相同,但与金属表面和原子之间的距离不正确,因此我尝试将前一个金属的微分位置添加到新文件中。感谢您的解决方案:)为什么要加载内存中的第一个文件
awk'NR==FNR{a[FNR]=$1;next}{$3+=a[FNR]}1'file-2 file-1
应该可以工作。我主要担心的是,如果每个文件中有三行相同的输入,您可以在代码中隐藏错误,这三行中的每一行都有不同的值,则可以取消屏蔽。这就是为什么我改变了一切,以便更可靠地发现任何类似的问题。例如,对于您的测试数据,“我的代码”可以在第3列中添加一半并保存第一行,然后简单地打印保存的行作为后续每行的输出。测试本可以通过,但代码将毫无用处。这在这里是相当明显的,但这些事情并不总是那么明显。@jaypal:解决问题的方法不止一种;对