2016-07-22 23 views
5

我讀過這個問題:Compare consecutive rows in awk/(or python) and random select one of duplicate lines。 現在我有一些額外的問題: 我應該如何更改代碼,如果我不想對x值進行比較,還需要對y值或更多的列進行比較? 也許像比較awk中的連續行和多個列以及隨機選擇其中一個重複行

if ($1 != prev) && ($2 != prev) ??? 

換句話說:我想比較,如果x值和當前行的y值是相同的x值和下一個連續的y值線。

數據:

#x y  z 
1 1 11   
10 10 12  
10 10 17  
4 4 14 
20 20 15   
20 88 16  
20 99 17 
20 20 22 
5 5 19 
10 10 20 

輸出應看起來像:

#x y  z 
1 1 11   
10 10 17  
4 4 14 
20 20 15   
20 88 16   
20 99 17  
20 20 22  
5 5 19 
10 10 20 

或(由於隨機選擇)

#x y  z 
1 1 11   
10 10 12  
4 4 14 
20 20 15   
20 88 16   
20 99 17  
20 20 22  
5 5 19 
10 10 20 

從上述鏈路的代碼,這並對於x值的東西,但不是在AND條件下的y值:

$ cat tst.awk 
function prtBuf(  idx) { 
    if (cnt > 0) { 
     idx = int((rand() * cnt) + 1) 
     print buf[idx] 
    } 
    cnt = 0 
} 

BEGIN { srand() } 
$1 != prev { prtBuf() } 
{ buf[++cnt]=$0; prev=$1 } 
END { prtBuf() } 

回答

2

這應做到:

function prtBuf(idx) { 
    if (cnt > 0) { 
     idx = int((rand() * cnt) + 1) 
     print buf[idx] 
    } 
    cnt = 0 
} 

BEGIN { srand() } 
$1 != prev1 || $2 != prev2 { prtBuf() } 
{ buf[++cnt]=$0; prev1=$1; prev2=$2 } 
END { prtBuf() } 
+0

是的,這樣做吧!做得好!如果有人想爲更多的colums做這個比較,它也很容易改變。 3列的示例:BEGIN {srand()} $ 1!= prev1 || $ 2!= prev2 || $ 3!= prev3 {prtBuf()} {buf [++ cnt] = $ 0; prev1 = $ 1; prev2 = $ 2; prev3 = $ 3} END {prtBuf()} – Jojo

相關問題