最初のフィールドとして主キー値を持ち、残りのフィールドとして対応する値を持つ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
代わりにどのコマンドを使用する必要がありますか?
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のみを埋めます。
次のことを試してください。
> 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。空のフィールドを機能させるには、ファイルの形式を知っている必要があります。
私はまさにそのキー、値の問題のためにPerlツールを書きました:
適切な行のペアリング:任意の数のファイル 。 GitHub からも利用できます。
それを実行するには、次のように入力します。
merge -k -e "-" jointest1.txt jointest2.txt