常會遇到有幾個文字檔, 裡面有幾個欄位是跟另外檔案是一致的, 要把他合併成一個檔案, 這時後最快的就是用 join.
- Man 說明: join - join lines of two files on a common field
這次遇到的狀況是:
- find . -size 0 > a # 找出 size 是 0 的 "圖檔檔名"
- b # 從 DB 撈出所有的 "相對應的帳號 => 圖檔檔名"
- 要將 size = 0 的圖檔都抓出來, 再將 a 和 b 做 join, 會把 a 和 b 依照 "圖檔檔名" 做結合, 就可知道哪些帳號的圖檔 Size = 0, 再來做其它處理囉~
- 註: 要注意要結合的那個欄位, 要先做過 sort, 不然可能會有某些欄位無法 match.
- 最後再 find . -size 0 -delete 全部砍掉~ 😛
依某個欄位合併兩個檔案的範例實作(Join)
- $ cat a
3 aa
5 uu
4 bb
7 38
2 oo - $ cat b
uu test
38 abc
oo def - $ sort -k 2 a | sed "s/ /:/" > a.sorted # 將主 key 做排序, 並將空白變成 ":"
7:38
3:aa
4:bb
2:oo
5:uu - $ sort b | sed "s/ /:/" > b.sorted # 將主 key 做排序, 並將空白變成 ":"
38:abc
oo:def
uu:test - join -t ":" -1 2 a.sorted -2 1 b.sorted # 或 join -t: -1 2 a.sorted -2 1 b.sorted 皆可
38:7:abc
oo:2:def
uu:5:test - 上述 join 就是得到合併完成的結果囉~
- 解釋上述 join 命令的意思:
- -t: 或 -t ":" : 依照 ":" 做切割欄位
- -1 2 a.sorted : 第一個檔案 a.sorted, 要拿他的第二欄出來
- -2 1 b.sorted : 第二個檔案 b.sorted, 要拿他的第一欄出來
- 這樣子就會把這兩個檔案抽出來的欄位做 match(join), 就會是結果~ 🙂
真是神奇呀!!
厄.. @.@a.. 就是 key 串起來囉~ 🙂