Seite 1 von 1

Bash pipe in Python

Verfasst: Freitag 9. Dezember 2011, 13:10
von mzh
Liebes Forum
Ich habe eine Datei, die so aussieht:

Code: Alles auswählen

A   3      31.221  22.957  43.101  1.00 54.39
A   3      31.828  24.118  42.476  1.00 49.68
A   3      31.979  23.854  41.021  0.00 48.07
A   3      31.496  24.598  40.166  0.00 48.08
A   3      33.178  24.436  43.069  1.00 49.69
A   3      33.279  25.867  43.567  1.00 29.38
A   3      33.230  25.978  45.078  1.00 70.62
(Spaltennummerierung fäng bei 1 an). Wenn ich Spalten 3, 4, und 5 mit ":" getrennt benötige, kann ich auf Bash

Code: Alles auswählen

cat datei.txt|awk '{print $3 " " $4 " " $4}'|tr " " ":"
eingeben und erhalte

Code: Alles auswählen

31.221:22.957:43.101
31.828:24.118:42.476
31.979:23.854:41.021
31.496:24.598:40.166
33.178:24.436:43.069
33.279:25.867:43.567
33.230:25.978:45.078
Wie mache ich dasselbe mit subprocess?

Re: Bash pipe in Python

Verfasst: Freitag 9. Dezember 2011, 13:38
von cofi
1. Useless use of `cat`
2. Der Aufruf von `tr` ist ebenfalls ueberfluessig, das kann `awk` schon selbst.
3. Warum per subprocess und nicht in Python?

Das scheint mir nicht mehr zu sein als:

Code: Alles auswählen

with open('datei.txt') as f:
    for line in f:
        a, b = line.split()[2:4]
        print "%s:%s:%s" % (a,b,b)
Dein awk Programm scheint mir aber nicht mit der Ausgabe zusammenzupassen (ich hab mich an dem Programm orientiert).

Nach der Ausgabe:

Code: Alles auswählen

with open('datei.txt') as f:
    for line in f:
        a, b, c = line.split()[2:5]
        print "%s:%s:%s" % (a, b, c)

Re: Bash pipe in Python

Verfasst: Freitag 9. Dezember 2011, 13:44
von mzh
Danke, aber es geht mir nicht umbedingt um die Funktion, sondern darum, subprocess, wie im ersten Post steht, besser zu verstehen. Das hier ist nur ein Beispiel und das wesentliche daran ist, dass zwei Pipes genutzt werden.
Mir ist schon klar, dass man das einfacher machen kann, ich habe einfach ein Beispiel mit zwei Pipes gebraucht.

Re: Bash pipe in Python

Verfasst: Freitag 9. Dezember 2011, 13:59
von jerch
Der kurze Weg:
- Subprozesse ausfindig machen (hier cat, awk und tr)
- Subprozesse erzeugen
- Ein-/Ausgaben entsprechend der Shellsyntax verknüpfen

Der lange Weg:
- Shellskriptparser bauen und den Parser obige Schritte vornehmen lassen