iT邦幫忙

0

shell script 如何查詢二個檔案間資料內容的差異

  • 分享至 

  • xImage

想請問各位大大
目前有2個檔案 分別是上週和本週的帳號內容資料
主要是要比對 這週(aaa)與上週(bbb) 新增了哪些帳號 和 刪除了哪些帳號
目前是把這2個檔案的帳號那個欄位抓了出來
ex: cat aaa|awk '{print $1}'

可是不知道如何下語法才能找出這2個檔案 本週新增和本週刪除的帳號
我試過用diff 這個參數,不過只能針對同樣一行的差異做判別

想請大大們指導下

Find 'diff' in this page.
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
8
逮丸逮丸
iT邦大師 1 級 ‧ 2011-11-21 23:28:41
最佳解答

「本週新增和本週刪除的帳號」
這個議題,
用 aaa集合 與 bbb集合 相減看結果,
比 看兩個檔案有何不同
會比較符合你想要的。

要在 shell script 裡處理陣列,
與其他新的程式語言比較起來,
算是比較麻煩。

像 shell script 怎麼比較兩個陣列:
Compare/Difference of two arrays in bash
要考慮太多的詳細步驟,
才做得出來。

而 perl 比較兩個陣列的元素,
在經典的 perl cookbook 裡:
Finding Elements in One Array but Not Another
還是需要迴圈來做比較,
仍然有點麻煩。

然而,這個是用 ruby 很簡單的 陣列 操作的語法,
就算出來了,
可參考一下:

<pre class="c" name="code">>> aaa = ["1032", "3234", "354366", "67844", "TA-34535", "TA-2343", "IA-23452"]
=> ["1032", "3234", "354366", "67844", "TA-34535", "TA-2343", "IA-23452"]
>> bbb = ["1032", "3234", "354366", "67844", "TA-34535", "TA-23452", "IA-26472"]
=> ["1032", "3234", "354366", "67844", "TA-34535", "TA-23452", "IA-26472"]
>> bbb - aaa
=> ["TA-23452", "IA-26472"]
>> aaa - bbb
=> ["TA-2343", "IA-23452"]

上述的 bbb - aaa 就是與前週比較,
被刪了什麼帳號。
aaa - bbb 就是與前週比較,
新增了什麼帳號。

在 ruby 程式裡,
陣列當作集合操做,
可參考:
Ruby Array Comparison Tricks
其他程式語言,可能不是可以這麼懶惰就操作出來。

我把你要比較兩組集合的內容,
做成很簡單的網頁方式來操作:
http://alpha.tagbible.net/zhjp/neo2124

可自行貼上兩組不同內容,
就可算出 新增了 或刪除了 什麼的結果。
程式碼很簡單,只是多一些網頁處理的動作:

<pre class="c" name="code">def compare
  first = params['first'].gsub(/\n\n/,'').split("\n")
  second = params['second'].gsub(/\n\n/,'').split("\n")
  r1 = first - second
  r2 = second - first
  result = "第一組有,第二組卻沒有(第二組 - 第一組):#{r2.join(',')}<br />"
  result += "第二組有,第一組卻沒有(第一組 - 第二組):#{r1.join(',')}"
    render :update do |page|
      page[:result].replace_html result
    end
end

第6,7行修正:

<pre class="c" name="code">  result = "第二組有,第一組卻沒有(第二組 - 第一組):#{r2.join(',')}<br />"
  result += "第一組有,第二組卻沒有(第一組 - 第二組):#{r1.join(',')}"
neo2124 iT邦新手 2 級 ‧ 2011-11-22 12:54:47 檢舉

實分感謝twtw 大大 提供詳細的方式參考,包含了其它語言的範例
真的很感謝QQ

6
edenhsu
iT邦新手 4 級 ‧ 2011-11-21 18:27:37

# cat aaa|awk '{print $1}'

root:x:0:0:root:/root:/bin/bash

awk -F : '{print $1}' /etc/passwd

root

這樣就可以做到你接下來要的比對了

neo2124 iT邦新手 2 級 ‧ 2011-11-21 20:15:19 檢舉

感謝大大的幫忙,目前這部份我先前有截取出來了 內容大約長這樣子
bbb aaa
====== ========
1032 1032
3234 3234
354366 354366
67844 67844
TA-34535 TA-34535
TA-2343 TA-23452
IA-23452 IA-26472
. .
. .
. .
主要是 aaa資料可能在這週 刪除了TA-2343並新增了IA-26472
這二個檔案內容大約都上千筆,目前是卡在 不知道要如何正確得知 aaa資料新增了多少帳號的名稱和刪除了哪些帳號的名稱

.<

neo2124 iT邦新手 2 級 ‧ 2011-11-21 20:17:50 檢舉

antijava 大大 有提供了一個diff 的link 說明
我再去看下, diff -u 看樣子好像可行,小弟再仔細研究下
先謝謝各位大神的指導,小弟的shell script 還很弱 ^^"

8
wiseguy
iT邦超人 1 級 ‧ 2011-11-21 23:47:26
&lt;pre class="c" name="code">diff &lt;(cat aaa | cut -d: -f1 | sort) \
     &lt;(cat bbb | cut -d: -f1 | sort) |\
sed -n '/^&lt;/{s//新增/;p};/^>/{s//刪除/;p}' |\
sort

diff 指令比對 aaa 跟 bbb 兩檔案排序過的第一欄 (帳號欄)
sed 則把新增的 < 符號轉為中文"新增",把刪除的符號 > 轉為中文"刪除"
最後一個 sort 則把新增跟刪除分成兩堆

我要發表回答

立即登入回答