web-dev-qa-db-ja.com

参加して、不足しているキー値を入力します

最初のフィールドとして主キー値を持ち、残りのフィールドとして対応する値を持つ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  

代わりにどのコマンドを使用する必要がありますか?

4
mbaitoff

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のみを埋めます。

5
Ulrich Schwarz

次のことを試してください。

> 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。空のフィールドを機能させるには、ファイルの形式を知っている必要があります。

8
ghostwheel

私はまさにそのキー、値の問題のためにPerlツールを書きました:

適切な行のペアリング:任意の数のファイルGitHub からも利用できます。

それを実行するには、次のように入力します。

merge -k -e "-" jointest1.txt jointest2.txt
1
guest