想請問各位大大
目前有2個檔案 分別是上週和本週的帳號內容資料
主要是要比對 這週(aaa)與上週(bbb) 新增了哪些帳號 和 刪除了哪些帳號
目前是把這2個檔案的帳號那個欄位抓了出來
ex: cat aaa|awk '{print $1}'
可是不知道如何下語法才能找出這2個檔案 本週新增和本週刪除的帳號
我試過用diff 這個參數,不過只能針對同樣一行的差異做判別
想請大大們指導下
「本週新增和本週刪除的帳號」
這個議題,
用 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
# cat aaa|awk '{print $1}'
root:x:0:0:root:/root:/bin/bash
root
這樣就可以做到你接下來要的比對了
感謝大大的幫忙,目前這部份我先前有截取出來了 內容大約長這樣子
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資料新增了多少帳號的名稱和刪除了哪些帳號的名稱
.<
antijava 大大 有提供了一個diff 的link 說明
我再去看下, diff -u 看樣子好像可行,小弟再仔細研究下
先謝謝各位大神的指導,小弟的shell script 還很弱 ^^"
<pre class="c" name="code">diff <(cat aaa | cut -d: -f1 | sort) \
<(cat bbb | cut -d: -f1 | sort) |\
sed -n '/^</{s//新增/;p};/^>/{s//刪除/;p}' |\
sort
diff 指令比對 aaa 跟 bbb 兩檔案排序過的第一欄 (帳號欄)
sed 則把新增的 < 符號轉為中文"新增",把刪除的符號 > 轉為中文"刪除"
最後一個 sort 則把新增跟刪除分成兩堆