天天看點

sed awk 去除重複行

http://butterflymacro.iteye.com/blog/guest_book

sed與awk去除

Unix F# 

1 如果僅僅是删除内容完全一樣重複行 

則可以使用sort先進行排序 然後使用 uniq進行删除重複資料即可

例如  CUST.TXT

Txt代碼  

sed awk 去除重複行
  1. 130000006800,17,151,01,250100  
  2. 130000006800,17,151,01,250101  
  3. 1300001077,17,151,01,256600  
  4. 1300002764,17,151,01,256600  
  5. 1300002764,17,151,01,256630  
  6. 1300003690,17,151,01,256600  
  7. 1300001077,17,151,01,256600  
  8. 1300004771,17,151,01256600  
  9. 1300006064,17,151,01,251900  
  10. 130000693300,17,151,01370102690715295  
  11. 1300013082,17,151,01,51700  

 第3行與第7行完全相同

 第一步:sort 進行排序

第二部: uniq 去除重複(必須先進行排序,否則uniq無法去除重複 uniq 是比較前後兩行的資料,如果相鄰兩行資料不同則認為資料不同)

Shell代碼  

sed awk 去除重複行
  1. sort CUST.TXT | uniq > Target.TXT  

 檢視Target.TXT

Txt代碼  

sed awk 去除重複行
  1. 130000006800,17,151,01,250100  
  2. 130000006800,17,151,01,250101  
  3. 1300001077,17,151,01,256600  
  4. 1300002764,17,151,01,256600  
  5. 1300002764,17,151,01,256630  
  6. 1300003690,17,151,01,256600  
  7. 1300004771,17,151,01256600  
  8. 1300006064,17,151,01,251900  
  9. 130000693300,17,151,01370102690715295  
  10. 1300013082,17,151,01,51700  

 發現 1300001077,17,151,01,256600 這條記錄隻有一條了

2 根據指定列進行去除重複行

 這裡的重複是指如果兩行的某一列資料相同,則認為是重複資料

例如第1行與第2行資料根據域分隔符","分割的第一列(CUST_ID)

第4行與第5行資料也是CUST_ID 相同 現在我們如何去除列相同的重複項

第一步: sort 進行排序

第二步: 用awk對相鄰兩行資料進行比較如果第一列的資料相同則去除重複行(保留第一個相同的行,)

 這裡的去除重複行 并不是真正的删除重複行而是 利用unix shell 管道 對重複行的不進行重定向輸出

Shell代碼  

sed awk 去除重複行
  1. sort -t, -k1 CUST.TXT | awk -F, '  
  2. {  
  3. $1 == CUST_ID {  
  4. }  
  5. $1 != CUST_ID {  
  6.   CUST_ID = $1;  
  7.   print $0;  
  8. }' > Target.TXT  

 運作結果如下:

Txt代碼  

sed awk 去除重複行
  1. 130000006800,17,151,01,250100  
  2. 1300001077,17,151,01,256600  
  3. 1300002764,17,151,01,256600  
  4. 1300003690,17,151,01,256600  
  5. 1300004771,17,151,01256600  
  6. 1300006064,17,151,01,251900  
  7. 130000693300,17,151,01370102690715295  
  8. 1300013082,17,151,01,51700  

 文法解釋:

  sort -t, -k1   

 -t,   指定檔案記錄域分隔符為","  

 -k1  是指根據第1列進行排序

 awk -F, ' {

 $1 == CUST_ID {

 }

 $1 != CUST_ID {

  CUST_ID = $1;

  print $0;

 } ' > Target.TXT

 -F, 指定域分隔符為","

 $1 == CUST_ID 判斷 第一列是否與變量 CUST_ID 相等  (不必要擔心 CUST_ID變量的值 在初始化時 awk 為 CUST_ID 指派 為"")

 如果相等什麼多不做

$1 != CUST_ID { CUST_ID = $1 ;print $0;}   如果 一列不等于 CUST_ID 變量的值  将 $1 指派為 CUST_ID

然後列印 這行資料 ,然後進行下一行  比較 下一行資料與上一行資料的CUST_ID 是否相等 相等 什麼都不敢 也就是說

不列印着一行 如果不相等則列印着一行 進而起到去除重複資料的作用