2015-11-01 39 views
1

我有两个文件我试图根据列加入/合并。如何合并Linux中的两个文件

文件1

aa 
bb 
aa 
bb 
cc 
aa 

文件2

aa 12e 
bb wqq 

希望的输出

aa 12e 
bb wqq 
aa 12e 
bb wqq 
cc 
aa 12e 
+0

你有什么办法吗? – Downvoter

+2

也许是一个复制:http://stackoverflow.com/questions/31097908/join-two-files-on-linux?rq=1 – wgitscht

+0

回答在这篇文章中使用AWK http://stackoverflow.com/questions/33268892 /使用awk-to-lookup-data-in-2-csv-files – nabeel

回答

3

下面是使用关联数组中击的方法。

首先,文件2被读出,和一个关联数组被构造,映射值:

declare -A mapping 

while read line; do 
    values=($line) 
    mapping[${values[0]}]=${values[1]} 
done < b.txt 

然后,文件1被读出,并且每个条目中查找,并添加到打印输出:

while read line; do 
    echo $line ${mapping[$line]} 
done < a.txt 

这将产生所需的输出:

aa 12e 
bb wqq 
aa 12e 
bb wqq 
cc 
aa 12e 

我觉得有一定是一个MO使用一些旧的UNIX时代工具也可以使用简洁的方式来完成这些工作。也许有人会启发我们。

+0

Tnx Jameson 但我不想删除重复的记录和排序 – David

+0

什么?你做还是不做?上面的代码可以满足你的要求。 – Jameson

+0

好的,我不想删除重复项。并将结果排序... – David

1
join -a 1 <(sort file1) <(sort -k1,1 file2) 

输出:

 
aa 12e 
aa 12e 
aa 12e 
bb wqq 
bb wqq 
cc 

缺点:文件1,你松秩序。

+0

Tnx赛勒斯 其罚款 但它会更好,如果没有排序 – David