合并与主键的bash文件(merge files with bash by primary key)

2019-07-21 01:55发布

我有两个文件与IP-地址作为主键。 文件中的两个刚刚与不同的信息的一个子集。 我想第2列添加到使用bash的第一个文件。

Failel:

192.168.1.1;hosta;aabbccddeef0
192.168.1.2;hostb;aabbccddeef1
192.168.1.3;hostc;aabbccddeef2

文件2:

192.168.1.2;differentHostname;

我用的方法对地址cat file2 | cut -d\; -f1; do grep -w $addr file1 ... cat file2 | cut -d\; -f1; do grep -w $addr file1 ... cat file2 | cut -d\; -f1; do grep -w $addr file1 ...不行,因为我无法从file2的访问的主机名。

有任何想法吗?

Answer 1:

这是join的功能:

$ join -a1 -t';' <(sort file1) <(sort file2)    
192.168.1.1;hosta;aabbccddeef0
192.168.1.2;hostb,aabbccddeef1;differentHostname;
192.168.1.3;hostc,aabbccddeef2

注: join需要有序的文件。

您可以指定输出的使用顺序-o选项:

$ join -a1 -t';' -o 1.1 1.2 2.2 1.3 <(sort file1) <(sort file2)
192.168.1.1;hosta;;aabbccddeef0
192.168.1.2;hostb;differentHostname;aabbccddeef1
192.168.1.3;hostc;;aabbccddeef2


Answer 2:

awk -F";" -v OFS=";" 'FNR==NR{a[$1]=$2;next}($1 in a){$(NF+1)=a[$1]}1' file2 file1

测试:

> awk -F";" -v OFS=";" 'FNR==NR{a[$1]=$2;next}($1 in a){$(NF+1)=a[$1]}1' temp2 temp
192.168.1.1;hosta;aabbccddeef0
192.168.1.2;hostb;aabbccddeef1;differentHostname
192.168.1.3;hostc;aabbccddeef2
> 


文章来源: merge files with bash by primary key