加入,填入缺失的鍵值

加入,填入缺失的鍵值

我有兩個文件,其主鍵值作為第一個字段,相應的值作為其餘字段,其中一個文件中缺少一些主鍵值,但在另一個文件中存在,反之亦然:

$ 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選項據說可以讓您選擇空字段的標記,但它在我的版本中似乎已損壞,並且僅填充案例 e,而不填充案例 c。

答案3

我為這個鍵值問題編寫了一個 perl 工具:

配對正確的行:任意數量的文件。也可以透過GitHub

要執行它,請鍵入:

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

相關內容