Ich benutze ein awk Skript, um einige ziemlich schwere Parsing zu machen, die in der Zukunft nützlich sein könnten, aber ich bin mir nicht sicher, ob mein Unix- unfreundliche Mitarbeiter werden bereit sein, awk/gawk zu installieren, um das Parsing durchzuführen. Gibt es eine Möglichkeit, eine eigenständige ausführbare Datei aus meinem Skript zu erstellen?Wer weiß, wie man ein in sich geschlossenes Awk/Gawk Programm unter Windows macht
Antwort
Ich bin einer Art und Weise nicht bewusst, eine in sich geschlossene binär mit AWK zu machen. Wenn Ihnen jedoch AWK gefällt, scheinen die Chancen gut, dass Ihnen Python gefällt, und es gibt mehrere Möglichkeiten, ein eigenständiges Python-Programm zu erstellen. Zum Beispiel Py2Exe.
Hier ist ein kurzes Beispiel von Python:
# comments are introduced by '#', same as AWK
import re # make regular expressions available
import sys # system stuff like args or stdin
# read from specified file, else read standard input
if len(sys.argv) == 2:
f = open(sys.argv[1])
else:
f = sys.stdin
# Compile some regular expressions to use later.
# You don't have to pre-compile, but it's more efficient.
pat0 = re.compile("regexp_pattern_goes_here")
pat1 = re.compile("some_other_regexp_here")
# for loop to read input lines.
# This assumes you want normal line separation.
# If you want lines split on some other character, you would
# have to split the input yourself (which isn't hard).
# I can't remember ever changing the line separator in my AWK code...
for line in f:
FS = None # default: split on whitespace
# change FS to some other string to change field sep
words = line.split(FS)
if pat0.search(line):
# handle the pat0 match case
elif pat1.search(line):
# handle the pat1 match case
elif words[0].lower() == "the":
# handle the case where the first word is "the"
else:
for word in words:
# do something with words
Nicht das gleiche wie AWK, aber leicht zu erlernen, und tatsächlich mächtiger als AWK (die Sprache verfügt über mehr Features und es gibt viele „Module“ zu importieren und verwenden). Python hat nichts implizit wie die
/pattern_goes_here/ {
# code goes here
}
Funktion in AWK, aber Sie können einfach eine if/elif/elif/else Kette mit Mustern übereinstimmen müssen.
Übrigens habe ich in der Vergangenheit viele AWK-Programme geschrieben, aber heutzutage bevorzuge ich Python. AWK gewinnt, wenn Sie nur einen schnellen Spaltenextraktor in der Shell entfernen wollen, aber Python gewinnt, wenn Sie etwas nichttriviales tun wollen. – steveha
Muss es in sich geschlossen sein? Sie könnten eine kleine ausführbare Datei schreiben, die awk mit den richtigen Argumenten aufruft und die Ergebnisse an eine Datei weiterleitet, die der Benutzer wählt, oder an stdout - je nachdem, was für Ihre Mitarbeiter geeignet ist.
Theres eine unabhängige awk.exe im Cygwin Toolkit, soweit ich weiß.
Sie könnten das einfach mit den Dateien, die Sie an Ihre Kollegen verteilen, einbinden.
Wenn es ein Teil von Cygwin ist, dann ist es nicht wirklich eigenständig, oder? Ich würde stattdessen den von http://unxutils.sourceforge.net/ verwenden. –
mawk in GnuWin32 — http://gnuwin32.sourceforge.net/packages/mawk.htm
auch interessante Alternative, Java-Implementierung — http://sourceforge.net/projects/jawk/
verteilen Sie gawk.exe zusammen mit Ihrem Skript. – ghostdog74