-1

可能重复:
Unix 连接两个文件的多个字段

我需要从加入字段 1 和 2 的两个文件中获取值,但这些字段不是唯一的。我需要获取所有值。例如

$cat test1.txt

1|2|aaa|bb
1|2|bbb|cc
1|3|ccc|dd
1|3|ddd|ee

$cat test2.txt

1|2|ccc|dd
1|2|eee|ff
1|2|fff|dd
1|3|ggg|hh

期望的输出:

1|2|aaa|bb|ccc|dd
1|2|aaa|bb|eee|ff
1|2|aaa|bb|fff|dd
1|2|bbb|cc|ccc|dd
1|2|bbb|cc|eee|ff
1|2|bbb|cc|fff|dd
1|3|ccc|dd|ggg|hh
1|3|ddd|ee|ggg|hh

正常join不工作。我怎样才能让它工作?

4

2 回答 2

0

join命令仅连接一个字段,因此您需要调整数据以便您有一个单独的字段可以连接。

sed 's/|/=/' test1.txt > test3.txt
sed 's/|/=/' test2.txt > test4.txt
join -t'|' test3.txt test4.txt | sed 's/=/|/'
于 2012-11-11T20:48:10.180 回答
0

一个 awk 单线适用于您的示例:

 awk -F'|' 'NR==FNR{a[$0]=FS$3FS$4;next;}{for(x in a)if(x~"^"$1"\\|"$2)print $0a[x]}' test2.txt test1.txt

测试:

kent$  head test*.txt
==> test1.txt <==
1|2|aaa|bb
1|2|bbb|cc
1|3|ccc|dd
1|3|ddd|ee

==> test2.txt <==
1|2|ccc|dd
1|2|eee|ff
1|2|fff|dd
1|3|ggg|hh

kent$  awk -F'|' 'NR==FNR{a[$0]=FS$3FS$4;next;}{for(x in a){ if(x~"^"$1"\\|"$2) print $0a[x]} }' test2.txt test1.txt 
1|2|aaa|bb|eee|ff
1|2|aaa|bb|fff|dd
1|2|aaa|bb|ccc|dd
1|2|bbb|cc|eee|ff
1|2|bbb|cc|fff|dd
1|2|bbb|cc|ccc|dd
1|3|ccc|dd|ggg|hh
1|3|ddd|ee|ggg|hh
于 2012-11-11T20:40:01.033 回答