2017-10-02 3 views
1

Ich habe eine Liste von Bereichen, und ich versuche, nachfolgende Einträge zusammenzuführen, die innerhalb einer bestimmten Entfernung voneinander liegen.Vergleichen Sie verschiedene Spalten aufeinanderfolgender Zeilen, um Bereiche zu verschmelzen

In meinen Daten enthält die erste Spalte die untere Grenze des Bereichs und die zweite Spalte die obere Grenze.
Die Logik folgt: Wenn der Wert in Spalte 1 kleiner oder gleich dem Wert in Spalte 2 der vorherigen Zeile plus einem bestimmten Wert ist, drucken Sie den Eintrag in Spalte 1 der vorherigen Zeile und den Eintrag in Spalte 2 von gegebene Reihe.

Wenn die beiden Bereiche innerhalb der durch die Variable 'dist' angegebenen Entfernung liegen, sollten sie zusammengeführt werden, andernfalls sollten die Zeilen so gedruckt werden, wie sie sind.

Input:  
1 10 
9 19 
51 60 

if dist=10, Desired output:  
1 19 
51 60 

bash verwenden, habe ich versucht, die Dinge in diese Richtung:

dist=10 
awk '$1 -le (p + ${dist}) { print q, $2 } {p=$2;} {q=$1} ' input.txt > output.txt 

Dies gibt Syntaxfehler.

Jede Hilfe wird geschätzt!

+0

kurzer Kommentar: Sie nicht 'bash' Syntax verwenden können in' awk' sie völlig verschiedene Dinge sind ... Gebrauch '<' , '<=', etc. zum Vergleich – Sundeep

+1

siehe https://stackoverflow.com/questions/19075671/how-doi-i-use-shell-variables-in-an-awk-script zum Übergeben von Shell-Variablen an awk – Sundeep

+2

awk ist keine Shell. Es ist ein komplett anderes Werkzeug mit eigener Syntax, Semantik und Umfang. Holen Sie sich Effective Awk Programming, 4. Edition, von Arnold Robbins, um zu lernen, wie man awk-Programme schreibt. –

Antwort

1

Angenommen, die Bedingung wird für 2 Paare aufeinanderfolgender Datensätze (d. H. Insgesamt 3 Datensätze) erfüllt, dann würde der dritte die Ausgabe von rec-1 und rec-2 als ihren vorherigen Datensatz betrachten.

awk -v dist=10 'FNR==1{prev_1=$1; prev_2=$2; next} ($1<=prev_2+dist){print prev_1,$2; prev_2=$2;next} {prev_1=$1; prev_2=$2}1' file 

Eingang:

$cat file 
1 10 
9 19 
10 30 
51 60 

Ausgang:

1 19 
1 30 
51 60 
+0

Vielen Dank BatMan! – Marla

Verwandte Themen