在shell中将2个文件连接到1

时间:2012-12-14 12:58:32

标签: linux file shell unix join

如何在shell中加入2个文件,例如:

file1 -

server1          monthly      25
server2          monthly      24
server3          daily        21
server4          weekly       7
server5          weekly       7                                         

file2 -

server1          monthly      5
server2          monthly      4
server3          daily        1
server4          weekly       2

你可以帮助我得到这样的输出:

server1          monthly      25     5
server2          monthly      24     4
server3          daily        21     1
server4          weekly       7      2
server5          weekly       7      0

2 个答案:

答案 0 :(得分:6)

这是join的作业:

$ join -a 1 -a 2 -e 0 -o '1.1 1.2 1.3 2.3' file1 file2
server1 monthly 25 5
server2 monthly 24 4
server3 daily 21 1
server4 weekly 7 2
server5 weekly 7 0

管道到column -t以获得格式良好的表格:

$ join -a 1 -a 2 -e 0 -o '1.1 1.2 1.3 2.3' file file2 | column -t 
server1  monthly  25  5
server2  monthly  24  4
server3  daily    21  1
server4  weekly   7   2
server5  weekly   7   0

使用重定向运算符将其存储到新文件中:

$ join -a 1 -a 2 -e 0 -o '1.1 1.2 1.3 2.3' file file2 | column -t > newfile

说明:

-a            print unpairable lines from file FILENUM, where FILENUM is
              1 or 2, corresponding to FILE1 or FILE2

-e EMPTY      replace missing input fields with EMPTY

-o FORMAT     obey FORMAT while constructing output line

-a用于显示server 5..中的file1行,其中file2 -e 0中没有找到这样的行,用{{替换任何空字段1}}和0用于格式化输出,-o表示1.1file1 field 1表示1.3等。

注意:file1 field 3确实要求首先对文件进行排序(在这种情况下已经是这种情况)因此通常与使用join命令相结合。

答案 1 :(得分:3)

这是使用awk的一种方式:

awk 'FNR==NR { a[$1,$2]=$3; next } { print $0, (a[$1,$2] ? a[$1,$2] : "0") | "column -t" }' file2 file1

结果:

server1  monthly  25  5
server2  monthly  24  4
server3  daily    21  1
server4  weekly   7   2
server5  weekly   7   0

说明:

  

FNR == NR {...}是一个构造,仅对参数列表中的第一个文件为真   因此,对于第一个文件,我们将第一列和第二列添加到一个数组中,将第三列指定为值。 'next'只是强制awk读取下一行输入(因此,它跳过处理剩下的代码)
  一旦awk处理完第一个文件,它就会移动到第二个文件

     

awk现在将打印出第二个文件中的每一行。在这个print语句的末尾加上一个叫做三元运算符的运算符,这个语句的形式如下:(x?a:b)
   它只是意味着:if(x)然后(a)else(b)。我本来可以写的:

awk 'FNR==NR { a[$1,$2]=$3; next } { if (a[$1,$2]!=0) print $0, a[$1,$2]; else print $0, "0" }' file2 file1 | column -t

......但三元是性感的。