2016-09-03 1 views
-2

Wie ich die folgenden datei.txt sortieren, die eine Menge von Punkten enthalten awk mit oderWie kann ich eine Art Punkte gesetzt innerhalb eines bestimmten Intervalls mit awk oder sed

sed
1.0 -0.6486 
0.8 -0.2384 
-0.2 0.0750 
-0.2 0.0750 
0.6 0.0754 
0.4 0.3150 
0.2 0.4985 
0.1  0.5742 
-0.1 0.7003 
-0.2 0.7528 
-0.4 0.8416 
-0.6 0.9133 
-0.8 0.9721 
-1.0 1.0208 

1.0  2.4600 
0.8  2.5526 
0.6  2.6431 
0.4  2.7286 
0.2  2.8070 
0.1  2.8433 
-0.1 2.9098 
-0.2 2.9400 
-0.4 2.9948 
-0.6 3.0428 
-0.8 3.0849 
-1.0 3.1218 

Ich mag die Zeilen löschen {-0,2, 0,0750} und (-0,2, 0,0750) und haben endgültige Form der Datei als:

1.0 -0.6486 
0.8 -0.2384 
0.6 0.0754 
0.4 0.3150 
0.2 0.4985 
0.1  0.5742 
-0.1 0.7003 
-0.2 0.7528 
-0.4 0.8416 
-0.6 0.9133 
-0.8 0.9721 
-1.0 1.0208 

1.0  2.4600 
0.8  2.5526 
0.6  2.6431 
0.4  2.7286 
0.2  2.8070 
0.1  2.8433 
-0.1 2.9098 
-0.2 2.9400 
-0.4 2.9948 
-0.6 3.0428 
-0.8 3.0849 
-1.0 3.1218 

ich brauche ein Skript, das von 1,0 bis -1,0 in Schritten auf 0,1 und löscht jede Zeile überprüfen kann nicht folgen Sie der fallenden Reihenfolge, in diesem Fall die zwei Punkte -0.2 und schreiben Sie den 'sortierten' Satz auf eine neue Datei. Ich bin neu in Linux.

+2

Würde mich freuen, wenn Sie hinzufügen, was Sie bisher versucht haben – sjsam

+1

sed ist kein gutes Werkzeug dafür. – Beta

+0

Zwei Anforderungen in einer Frage, und das auch ohne gültige Bemühungen .. Hmm Abstimmung, um diese als Off-Topic zu schließen. – sjsam

Antwort

1

Zunächst hat Ihre Frage ein Problem, indem Sie sagen, dass Sie "jede Zeile löschen möchten, die nicht der absteigenden Reihenfolge folgt", aber -0,2 ist eine Abnahme von 0,8. Wenn Sie aber sagen, dass die Reihenfolge abnimmt, um auf "in Schritten auf 0,1" zu verweisen, dann gibt es ein anderes Problem, nämlich dass die meisten Ihrer Datenpunkte in Schritten von 0,2 und nur wenige um 0,1 abnehmen.

Die nicht angegebene Anforderung aus Ihren Daten besteht darin, dass eine leere Zeile das Skript so zurücksetzt, dass es wieder bei 1.0 beginnt.

Also habe ich Ihre Frage als "Der x-Wert in jeder Unterliste muss um 1 oder 2 Schritte von 0,1", und schrieb die folgenden awk einen Liner (Ich fügte die Zeilenumbrüche für Klarheit, aber Sie können lassen sie sie heraus, dass es von der Kommandozeile direkt zu verwenden, wie ich) tat:

awk 'function NewList() { 
     xPrev=1.0+delta 
    }; 
    BEGIN { 
     delta=0.1; 
     maxSteps=2; 
     epsilon=0.0000001; 
     NewList() 
    }; 
    NF { 
     if (($1-epsilon <= xPrev - delta) && ($1+epsilon >= xPrev - delta*maxSteps)) { 
      print; 
      xPrev=$1 
     } 
     next 
    }; 
    { 
     NewList(); 
     print "" 
    }' 

Beachten sie, dass die „epsilon“ variable Gleitpunktarithmetik um die Ungenauigkeit der Computer bekommt; Ohne es könnte das Programm (auf meinem System) aufhören, die Ausgabe nach ein paar Punkten zu drucken, aufgrund von winzigen (und nicht angezeigten) Differenzen von den Dezimalwerten.

Verwandte Themen