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

常會遇到有幾個文字檔, 裡面有幾個欄位是跟另外檔案是一致的, 要把他合併成一個檔案, 這時後最快的就是用 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 全部砍掉~ 😛

依某個欄位合併兩個檔案的範例實作(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), 就會是結果~ 🙂

關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 Programming。將永久鏈結加入書籤。

Linux Bash 命令: Join (指定某個欄位為主, 來合併多個檔案) 有 2 則回應

  1. 科科 說道:

    真是神奇呀!!

  2. Tsung 說道:

    厄.. @.@a.. 就是 key 串起來囉~ 🙂

發表迴響