如何在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
答案 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.1
,file1 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
......但三元是性感的。