2016-07-22 47 views
5

Przeczytałem pytanie: Compare consecutive rows in awk/(or python) and random select one of duplicate lines. Teraz mam dodatkowe pytanie: Jak powinienem zmienić kod, jeśli chcę zrobić to porównanie nie tylko dla wartości x, ale także dla wartości y lub większej liczby kolumn? Może cośPorównaj kolejne rzędy i wiele kolumn w awk i losowo wybierz jedną z duplikatów linii

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

Innymi słowy: Chcę porównać jeśli x-wartość i y-wartość bieżącej linii jest taka sama jak wartość X a Y wartości następnego rzędu kwestia.

Dane:

#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 

Wyjście powinno wyglądać tak:

#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 

lub (ze względu na wybór losowy)

#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 

Kod z powyższego linku, który robi rzeczy dla wartości x, ale NIE dla wartości y w warunku AND:

$ 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() } 

Odpowiedz

2

ten powinien zrobić:

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

Tak, to prawda! Dobra robota! Łatwo to też zmienić, jeśli ktoś chce zrobić to porównanie za jeszcze więcej kolumn. Przykład dla 3 kolumn: BEGIN {srand()} $ 1! = Prev1 || 2 USD! = Prev2 || 3 $! = Prev3 {prtBuf()} {buf [++ cnt] = 0 USD; prev1 = 1 $; prev2 = 2 USD; prev3 = 3 $} END {prtBuf()} – Jojo