最初のフィールドに主キー値があり、残りのフィールドにその値を持つ2つのファイルがあります。一部の主キー値はあるファイルにはありませんが、他のファイルにはあり、その逆も同様です。
$ cat jointest1.txt jointest2.txt
a 1
b 2
d 4
e 5
a 10
b 11
c 12
d 13
出力では、欠落している値を置き換えたり変更したりすることなく、主キーに基づいてこれらのファイルをマージすると予想されます。たとえば、次のようになります。
$ joinmerge jointest1.txt jointest2.txt
a 1 10
b 2 11
c - 12
d 4 13
e 5 -
欠落している値をダッシュまたは他のものに置き換える機能はオプションです。
これを試しましたが、join
ファイルが正しくソートされていないと表示されます。
$ join jointest1.txt jointest2.txt
a 1 10
b 2 11
join: file 2 is not in sorted order
d 4 13
どのコマンドを使用する必要がありますか?
答え1
以下を試してください。
> join -e- -a1 -a2 jointest1 -o 0 1.1 1.2 2.1 2.2 jointest2
a a 1 a 10
b b 2 b 11
c - - c 12
d d 4 d 13
e e 5 - -
または
> join -e- -a1 -a2 jointest1 -o 0 1.2 2.2 jointest2
a 1 10
b 2 11
c - 12
d 4 13
e 5 -
-oオプションなしで同じ目標を達成できるかどうかを理解する方法がわかりません。 -oオプションは、接続フィールドを最初に印刷してからフィールド番号を印刷することを意味します。ファイル1の2、ファイル2のフィールド2
答え2
join
どの実装を使用していますか?それでjoin (GNU coreutils) 5.97
私は使用できます
[0 1021] ~/temp/jointest % join -a1 -a2 jointest1.txt jointest2.txt
a 1 10
b 2 11
c 12
d 4 13
e 5
「一般」結合も機能します(ただし、cとeは省略されます)。空のフィールドのタグを選択するオプションがありますが、私のバージョン-e
では問題があるように見え、ケースcではなくケースeのみを入力します。
答え3
私はこの重要な値の問題に対するPerlツールを書いています。
正しい行ペア:ファイル数制限なし。合格することもできますGitHub。
実行するには、次のように入力します。
merge -k -e "-" jointest1.txt jointest2.txt