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