目标:使用文件中存在的公用密钥合并两个文件的内容
file1.txt
=========
key1 11
key2 12
key3 13
file2.txt
=========
key2 22
key3 23
key4 24
key5 25
Expected Output :
==================
key1 11
key2 12 22
key3 13 23
key4 24
key5 25
尝试过的方法:
join
命令:join -a 1 -a 2 file1.txt file2.txt ## full outer join
awk
:awk 'FNR==NR{a[$1]=$2;next;}{ print $0, a[$1]}' 2.txt 1.txt
方法 2 产生右外连接而不是完整外连接:
key1 11
key2 12 22
key3 13 23
方法 2 中需要修改哪些内容才能产生完全外连接?
答案1
我的解决方案使用join
:
join -a1 -a2 -1 1 -2 1 -o 0,1.2,2.2 -e "NULL" file1 file2
awk
我对加入大文件不太了解,并且总是使用join
.
key1 11 NULL
key2 12 22
key3 13 23
key4 NULL 24
key5 NULL 25
答案2
我的解决方案是awk:
awk '{a[$1]=a[$1]" "$2} END{for(i in a)print i, a[i]}' file1.txt file2.txt
使用keyn
作为索引,将second fields
每行中的 附加到相应的行 a[keyn]
(使用space
)。最后,打印所有indices
和array element
。
输出:
AMD$ awk '{a[$1]=a[$1]" "$2} END{for(i in a)print i, a[i]}' file1.txt file2.txt
key1 11
key2 12 22
key3 13 23
key4 24
key5 25
答案3
与awk
,尝试:
awk '{a[$1]=($1 in a)?a[$1]" "$2:$2};END{for(i in a)print i,a[i]}' file1 file2
对于大文件,您应该使用join
而不是awk
方法,因为awk
方法会在打印之前将所有文件内容存储在内存中。
答案4
你的第一个join
在这里似乎没问题,尽管大写字母拼写错误:
$>join -a 1 -a 2 file1.txt file2.txt
key1 11
key2 12 22
key3 13 23
key4 24
key5 25