2016-07-22 21 views
5

Ich las die Frage: Compare consecutive rows in awk/(or python) and random select one of duplicate lines. Jetzt habe ich einige zusätzliche Frage: Wie sollte ich den Code ändern, wenn ich diesen Vergleich nicht nur für den X-Wert, sondern auch für den Y-Wert oder mehr Spalten tun möchte? Vielleicht so etwas wieVergleichen aufeinanderfolgende Zeilen und mehrere Spalten in awk und zufällige wählen Sie eine der doppelten Zeilen

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

Mit anderen Worten: Ich möchte, wenn der x-Wert vergleichen und die y-Wert der aktuellen Zeile ist der gleiche wie der x-Wert und der y-Wert des nächsten Mal in Folge Linien.

Die Daten:

#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 

sollte die Ausgabe wie folgt aussehen:

#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 

oder (aufgrund von Zufallsauswahl)

#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 

Der Code aus der obigen Verbindung, die tut das Zeug für die x-Werte, aber NICHT für die y-Werte in einer UND-Bedingung:

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

Antwort

2

Dies sollte es tun:

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

Ja, das tut es! Gut gemacht! Es ist auch leicht zu ändern, wenn jemand diesen Vergleich für noch mehr Spalten machen möchte. Beispiel für 3 Spalten: BEGIN {srand()} $ 1! = Prev1 || $ 2! = Prev2 || $ 3! = Prev3 {prtBuf()} {buf [++ cnt] = $ 0; prev1 = $ 1; prev2 = $ 2; prev3 = $ 3} END {prtBuf()} – Jojo

Verwandte Themen