結合、欠落しているキー値を埋める

結合、欠落しているキー値を埋める

最初のフィールドとして主キー値を持ち、残りのフィールドとして対応する値を持つ 2 つのファイルがあり、そのうちの 1 つには主キー値が欠落していますが、もう 1 つには存在し、その逆も同様です。

$ 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空のフィールドのマーカーを選択できるオプションがありますが、私のバージョンでは壊れているようで、case e のみが埋められ、case c は埋められません。

答え3

私はまさにそのキーと値の問題に対処する Perl ツールを作成しました。

適切な行をペアリングする: 任意の数のファイル. こちらでも入手可能ですGitHub

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

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

関連情報