-1

重複の可能性:
2 つのファイルの複数のフィールドでの Unix 結合

フィールド 1 と 2 で結合する 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 に答える