2016-04-01 8 views
0

Ist es überhaupt möglich, bc basierend auf der Ausgabe eines Befehl zu berechnen?Verrohrung der Ausgabe eines Schnittvorgangs zu bc

Lets sagen, dass ich die folgende Spalte basierte Datei habe:

PAK_01896  PAU_03392  75.8 149  32  1  1  145  1  149  *  * 
PAK_02014  PAU_03392  69.8 149  45  0  1  149  1  149  *  * 
PAU_02074  PAU_03392  77.2 149  30  1  1  145  1  149  *  * 
PAU_02206  PAU_03392  69.1 149  46  0  1  149  1  149  *  * 
PAU_02775  PAU_03392  79.2 149  31  0  1  149  1  149  *  * 
PAK_02606  PAU_03392  78.5 149  32  0  1  149  1  149  *  * 
PAU_01961  PAU_03392  67.1 149  49  0  1  149  1  149  *  * 
PAK_03203  PAU_03392  95.3 149  7  0  1  149  1  149  *  * 
PLT_01716  PAU_03392  76.5 149  35  0  1  149  1  149  *  * 
PLT_01758  PAU_03392  79.2 149  31  0  1  149  1  149  *  * 
PAU_03392  PAU_03392  100.0 149  0  0  1  149  1  149  *  * 
PLT_01696  PAU_03392  78.5 149  32  0  1  149  1  149  *  * 
PLT_02424  PAU_03392  78.5 149  32  0  1  149  1  149  *  * 
PLT_01736  PAU_03392  77.2 149  34  0  1  149  1  149  *  * 
PLT_02568  PAU_03392  67.1 149  49  0  1  149  1  149  *  * 
PAK_01787  PAU_03392  66.4 149  50  0  1  149  1  149  *  * 

Ich möchte in der Lage sein, einige Berechnung auf bestimmte Felder durchzuführen, zum Beispiel etwas zu den Auswirkungen der Addition und/oder die dritten Mittelungs Säule. In meinem Kopf dachte ich zuerst versuchen, diese:

cut -f3 column_based_file.txt | bc 

Aber vielleicht wenig überraschend dies gibt nur den Wert der einzelnen Elemente in der Spalte 3

Ich weiß, dass es funktionierende Lösungen für diese in Fäden wie this one, dass Ich könnte es verwenden, aber da cut meine Art der Manipulation von spaltenbasierten Daten in bash für eine Weile war, frage ich mich, ob es überhaupt möglich ist? Vielleicht hat bc eine Flagge für zu einem Zeitpunkt, in einer Zeile zu lesen und ihnen usw.

EDIT Es gibt einige großen Lösungen in den Themen vorgeschlagen und in den Antworten gegeben zu speichern. Aus Neugier, denn das war, wie ich ursprünglich gedacht hatte, hat jemand eine und bc basierte Lösung (wenn aus irgendeinem Grund Perl oder awk nicht verfügbar waren vielleicht?)

+0

Siehe: [Shell Befehl zu summieren Integer, eine pro Zeile?] (Http://Stackoverflow.com/q/450799/3776858) – Cyrus

+1

Ah toll, kam nicht auf diese eine, wie ich sah durch Schnitt 'und' bc' Schlüsselwörter. –

+0

'sum = $ (sed -r" s/+/\ t/g "sumavg.csv | schneiden -f 3 | einfügen -s -d + - | bc)' für die Summe. (Ich brauche den Schritt sed, um Leerzeichen in eine Registerkarte zu zerquetschen) und 'lc = $ (wc -l sumavg.csv | cut -f1 -d" ")' für die Zeilenanzahl (darauf achten, dass die letzte Datenzeile endet) mit newline) und dann die Ausgaben: 'echo $ sum' und' echo "scale = 3; $ sum/$ lc" | bc' für den Durchschnitt –

Antwort

3

würde ich awk verwenden. Es ist meiner bescheidenen Meinung nach besser für diese Aufgabe geeignet. Sagen Sie Ihre Daten in sumavg.csv gespeichert sind, dann ist dieses GNU awk-Skript (sumavg.awk) zeigt Summe und Durchschnitt des dritten Feldes:

{s += $3 } 
END {print "Sum:", s, " Avg: ", s/FNR} 

Run es mit dem Befehl awk -f sumavg.awk sumavg.csv.

$3 ist das dritte Feld in jeder Zeile, END ist ein spezielles Muster seine Aktion wird am Ende ausgeführt, FNR gibt die Anzahl der Zeilen in der Datei.

+0

Ah, das ist sehr nett! Ich hatte wirklich nie den richtigen Grund, um mit 'awk' klarzukommen, aber ich vermute, dass ich das eher früher als später tun sollte ... –

+0

Wenn ich das awk-Skript haben wollte, um den Namen der Datei in der Ausgabe zu drucken, wie würde ich das umsetzen? Die Verwendung von 'END {print 'Datei war:' '$ 3' etc ...} löst einen Syntaxfehler aus. Ich kann nicht herausfinden, was ich falsch mache, basierend auf anderen Threads. –

+0

Verwenden Sie 'print FILENAME," Summe: ", s," Avg: ", s/FNR' in der END-Sektion. –