unix中两个文件中的多对多关系

时间:2012-11-11 20:25:20

标签: shell unix join scripting ksh

  

可能重复:
  Unix join on multiple fields on two files

我需要从字段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无效。我怎样才能让它发挥作用?

2 个答案:

答案 0 :(得分:0)

awk one-liner适用于您的示例:

 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

答案 1 :(得分:0)

join命令仅加入单个字段,因此您需要对数据进行处理,以便您可以加入一个字段。

sed 's/|/=/' test1.txt > test3.txt
sed 's/|/=/' test2.txt > test4.txt
join -t'|' test3.txt test4.txt | sed 's/=/|/'