2016-07-22 17 views
5

Şu soruyu okuyun: Compare consecutive rows in awk/(or python) and random select one of duplicate lines. Şimdi başka bir sorum var: Bu karşılaştırmayı yalnızca x değeri değil, aynı zamanda y değeri veya daha fazla sütun için de yapmak istersem kodu nasıl değiştirmeliyim? Belki bir şey başka deyişle Ardışık satırları ve birden çok sütunu awk ve rasgele olarak karşılaştırın Yinelenen satırlardan birini seçin

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

gibi: Ben x değeri VE akım hattının y değeri x-değeri VE sonraki ardışık y değeri ile aynı olup olmadığını karşılaştırmak istediğiniz çizgiler.

veriler:

#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 

çıkış gibi görünmelidir:

#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 

veya (nedeniyle rasgele seçim için)

#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 

yapar yukarıdaki linkten kod x değerleri için bir şey, ancak bir AND koşulundaki y değerleri için DEĞİL:

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

cevap

2

Bu yapmalıyım:

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

Evet, bu öyle! Aferin! Birisi daha fazla sütun için bu comparsion yapmak isterse, değiştirmek de kolaydır. 3 sütun örneği: BEGIN {srand()} $ 1! = Prev1 || 2 $! = Önceki2 || 3 $! = Prev3 {prtBuf()} {buf [++ cnt] = 0 TL; prev1 = $ 1; prev2 = $ 2; prev3 = 3 TL} END {prtBuf()} – Jojo

İlgili konular