2016-12-09 1 views
-4

Ich habe eine Textdatei, die wie folgt aussieht:Den Wert aller Zeilen in einer Textdatei hinzufügen?

0,5 
3,100 
30,90 

Für jede Zeile, ich brauche den Wert der ersten Spalte aus dem Wert der zweiten Spalte zu subtrahieren und dann 1 addieren und dann addieren sich jeweils Reihe. Für das obige Beispiel:

5-0+1 = 6 
100-3+1 = 98 
90-30+1 = 61 

Dann würde ich aufaddieren nur diese Zahlen: 6+98+61 = 165.

Das Endergebnis, das ich versuche, damit zu erhalten, ist die Nummer 165. Solange die gleiche Logik oben verfolgt wird, ist es mir egal, ob es auf andere Weise gemacht wird. Ich versuche nur den besten Weg herauszufinden.

Die Textdatei enthält etwa 15 Millionen Textzeilen. Die zweite Zahl ist immer höher als oder gleich der ersten Zahl, so dass Sie sich nie um Negative kümmern müssen.

Ich wäre in Ordnung, dies in welcher Sprache wäre am besten, solange es nicht zusätzliche (nicht-Standard) Module installiert werden müssen. Alle Beispiele würden ebenfalls geschätzt werden.

Mein Hauptanliegen ist, dass es 15 Millionen Zeilen verarbeitet, ich brauche es so schnell wie möglich, und ich bin nicht vertraut genug mit Programmiersprachen zu wissen, welche die effizienteste wäre. Diese

+0

Sie haben zwei anständige Antworten, aber Sie sollten wirklich zeigen, was Sie versucht haben. Wie groß ist die Summe? Sie müssen sich möglicherweise um arithmetische Überläufe kümmern. Außerdem ist die Berechnung äquivalent zu sum (col2) - sum (col1) + NumRows. Ob das besser ist als die Arithmetik in jeder Zeile, hängt zum Teil von den Werten ab. –

Antwort

1

ist aus der Spitze von meinem Kopf, aber ich denke, awk ist eine mögliche Lösung (nehmen die Zahlen sind in numbers.txt):

awk -F, '{tot += $2 - $1 + 1} END{print tot}' < numbers.txt 

Die -F, sagt awk dass Komma ist ein Separator, tot beginnt mit 0, standardmäßig ist END ein awk-Schlüsselwort, das besagt, dass der Codeblock ausgeführt wird, der folgt, nachdem EOF auf die Daten angewendet wurde.

Awk ist nicht die schnellste Waffe im Arsenal, aber ich würde es versuchen, da es auf einer Linie passt!

+0

Danke! Arbeitete perfekt, ich werde deine Antwort in 3 Minuten akzeptieren, wenn es mich lässt. :) – Andrew

+0

Aus Neugier, wie lange dauert es für die 15M Zeilen? (Sie können "Zeit" vor den Befehl setzen, um das Timing zu erhalten.) –

+0

Es war viel, viel schneller als ich erwartet hatte: 'real - 0m 0.134s, Benutzer - 0m 0.131s, sys - 0m 0.003s' – Andrew

1

In Perl, würde ich es tun, wie folgt:

#!/usr/bin/env perl 
use strict; 
use warnings; 

my $sum; 
while (<>) { 
    m/(\d+),(\d+)/; 
    $sum += $2 - $1 + 1; 
} 
print $sum; 

Welche Einzeiler-ifies wie;

perl -F',' -lane '$sum += $F[1] - $F[0] + 1; END { print $sum }' 
Verwandte Themen