2009年9月15日 星期二

[引用]Linux Bash 命令: Join (指定某個欄位為主, 來合併多個檔案)

Tsung's Blog

常會遇到有幾個文字檔, 裡面有幾個欄位是跟另外檔案是一致的, 要把他合併成一個檔案, 這時後最快的就是用 join.

  • Man 說明: join - join lines of two files on a common field

這次遇到的狀況是:

  1. find . -size 0 > a # 找出 size 是 0 的 "圖檔檔名"
  2. b # 從 DB 撈出所有的 "相對應的帳號 => 圖檔檔名"
  3. 要將 size = 0 的圖檔都抓出來, 再將 a 和 b 做 join, 會把 a 和 b 依照 "圖檔檔名" 做結合, 就可知道哪些帳號的圖檔 Size = 0, 再來做其它處理囉~
  4. 註: 要注意要結合的那個欄位, 要先做過 sort, 不然可能會有某些欄位無法 match.
  5. 最後再 find . -size 0 -delete 全部砍掉~ :P

依某個欄位合併兩個檔案的範例實作(Join)

  1. $ cat a
    3 aa
    5 uu
    4 bb
    7 38
    2 oo
  2. $ cat b
    uu test
    38 abc
    oo def
  3. $ sort -k 2 a | sed "s/ /:/" > a.sorted # 將主 key 做排序, 並將空白變成 ":"
    7:38
    3:aa
    4:bb
    2:oo
    5:uu
  4. $ sort b | sed "s/ /:/" > b.sorted # 將主 key 做排序, 並將空白變成 ":"
    38:abc
    oo:def
    uu:test
  5. 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
  6. 上述 join 就是得到合併完成的結果囉~
    • 解釋上述 join 命令的意思:
    • -t: 或 -t ":" : 依照 ":" 做切割欄位
    • -1 2 a.sorted : 第一個檔案 a.sorted, 要拿他的第二欄出來
    • -2 1 b.sorted : 第二個檔案 b.sorted, 要拿他的第一欄出來
    • 這樣子就會把這兩個檔案抽出來的欄位做 match(join), 就會是結果~ :)

【下列文章您可能也有興趣】

沒有留言: