0

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

文件 1 -

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

文件2 -

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
4

2 回答 2

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..in file1where no such line is found infile2 -e 0替换任何空字段,并0用于-o格式化输出 where和mean等。 1.1file1 field 11.3file1 field 3

注意:join确实需要首先对文件进行排序(在这种情况下它们已经是),因此通常与sort命令的使用结合使用。

于 2012-12-14T13:01:13.460 回答
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 现在将打印出第二个文件中的每一行。在这个打印语句的末尾附加了一个称为三元运算符的运算符,该语句的形式为: ( x ? a : b )
它的意思很简单: if (x) then (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

...但是三元组很性感。

于 2012-12-14T13:21:13.603 回答