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