我有兩個文件,其主鍵值作為第一個字段,相應的值作為其餘字段,其中一個文件中缺少一些主鍵值,但在另一個文件中存在,反之亦然:
$ 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