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