2016-07-06 2 views
1

Ich habe eine sehr große .txt. Ich muss die Daten manipulieren, um herauszufinden, wie viele Informationen gespeichert sind. Ich muss im Wesentlichen alle einzelnen Datenpunkte zusammenfassen. Das Problem ist, dass alle Daten in Spalten gespeichert sind und ich bin mir nicht sicher, wie man Linux-Befehle ausführt, um alles richtig zu summieren.Summe Spalten einer großen. TXT oder. CSV Linux

Ein Teil der Datei:

header:                 
    seq: 0                 
    stamp:                 
    secs: 1467830307                 
    nsecs: 890825036                 
    frame_id: map                
info:                
    map_load_time:                 
    secs: 0                
    nsecs:   0                 
    resolution: 0.0500000007451                
    width: 7200                
    height: 7200                
    origin:                
    position:                
     x: -180.0                
     y: -180.0                
     z: 0.0                 
    orientation:                 
     x: 0.0                 
     y: 0.0                 
     z: 0.0                 
     w: 1.0                 
data: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] 

Die eigentliche Datei ist eine sehr viel größer als das, aber im Wesentlichen muss ich innerhalb dieser ‚Daten‘ Set alle Zahlen addieren (alles andere gelöscht werden kann) . Vielen Dank im Voraus.

+0

Bitte formatieren Sie Ihre Frage so können wir verstehen, was Ihre Datei aussieht. Hat es tatsächlich eine Zeile, die "Header:" oder "Data:" lautet? Wenn nicht, könnte man einfach ein Beispiel der Datei einfügen. Ein paar Aufzeichnungen. Und formatieren Sie es als Code, damit wir es lesen können. – JNevill

+0

Entschuldigung, ich denke, es sollte ein bisschen einfacher sein, jetzt zu sehen. Alles (Header, Info, ect.) Ist Teil der eigentlichen Datei. Ich dachte daran, nur das zu löschen und nur die Datenleitung zu haben, und versuche dann, das zu summieren. – Miscott

+0

Sind die 'Daten' immer die letzte Sache in der Datei? Sind die Daten immer die einzige Sache in '[...]' in der Datei? –

Antwort

1

Dateien Angenommen wird data.txt genannt, würde ich awk wie folgt verwenden:

awk ' 
    /^data:/ {f=1} 
    f==1  {gsub(/[a-zA-Z:\[\]]/,""); for(i=1;i<=NF;i++)t+=$i} 
    END  {print t} 
' data.txt 

, dass Ihre Datei zu einem Zeitpunkt data.txt eine Zeile liest. Wenn es das Wort data: am Anfang einer Zeile findet, setzt es ein Flag f, so dass es "weiß" es hat hinter all die Sachen am Anfang der Datei und es muss beginnen, die Summe der Zahlen.

Der nächste Teil betrachtet nur Zeilen nach dem Wort data:, da ihm die Bedingung f==1 vorangestellt ist. Das entfernt alle Buchstaben, Doppelpunkte und eckige Klammern aus der Zeile mit gsub(). Dann durchläuft es alle Felder der Zeile (NF ist die Anzahl der Felder) und summiert die Elemente in einer Variablen namens t auf.

Am Ende der Datei wird der Abschnitt gestartet, der mit END beginnt und die Summe ausgibt.

Sie können alles auf eine Zeile wie diese schreiben, wenn Sie bevorzugen:

awk '/^data:/{f=1} f==1{gsub(/[a-zA-Z:\[\]]/,"");for(i=1;i<=NF;i++)t+=$i} END{print t}' data.txt 
+0

Funktioniert gut, danke! – Miscott

+0

Wenn Sie alle Buchstaben löschen, wird NF neu berechnet? andernfalls wird die mit Daten beginnende Zeile mit den nächsten Zeilen falsch ausgerichtet sein (dh die "Daten" -Zeilen haben ihren Wert in "Spalte + 1" verglichen mit den Zeilen ohne Daten am Anfang ...) (dh die erste 0 im Beispiel ist in Spalte 2, und auch col1 wird auch als 0 interpretiert!) –

+0

sorry, habe nicht verstanden, dass die OP nur eine flache Addition von allen brauchen, und nicht eine Summe pro Spalten ... (wo meine vorherige Kommentar wäre hier zu berücksichtigen, hier ist alles in Ordnung, und die Addition von "" ($ 1, früher "Daten") addiert nur 0 zur Summe, also ist das Ergebnis korrekt –