首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在bash脚本中合并不同文件的列

如何在bash脚本中合并不同文件的列
EN

Stack Overflow用户
提问于 2014-09-04 05:35:16
回答 2查看 1.1K关注 0票数 0

我有两份文件:

档案-1

代码语言:javascript
复制
1  2  3  4  
1  2  3  4  
1  2  3  4  

档案-2

代码语言:javascript
复制
0.5  
0.5  
0.5  

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

输出

代码语言:javascript
复制
1  2  3.5  4  
1  2  3.5  4  
1  2  3.5  4  

我试过了,但它不能正确地工作:

代码语言:javascript
复制
awk '{print  $1, $2, $3+file-2 }'  file-2=$1_of_file-2 file-1 > file-3  

我知道awk语句是不对的,但是我想使用这样的语句,有人能帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-04 05:56:46

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

代码语言:javascript
复制
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中)产生如下输出:

代码语言:javascript
复制
$ 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中每一行的一行,然后您可以简单地打印数据,而不需要积累任何内容:

代码语言:javascript
复制
awk '{ getline add < "file-2"; $3 += add; print }' file-1

这对于任何大小的文件来说都是相当干净的(只要文件有相同的行数--或者更准确地说,只要file-2至少有和file-1一样多的行)。

票数 2
EN

Stack Overflow用户

发布于 2014-09-04 06:46:35

这样做可能会奏效:

代码语言:javascript
复制
cat f1
1 2 3 4
2 3 6 5
3 4 9 6 
代码语言:javascript
复制
cat  f2
0.1
0.2
0.3
代码语言:javascript
复制
awk 'FNR==NR {a[NR]=$1;next} {$3+=a[FNR]}1' f2 f1
1 2 3.1 4
2 3 6.2 5
3 4 9.3 6

在我发布之后,我确实看到了这与Jaypal在一条评论中的相同之处。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25657951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档