Re: awk-Skript mit festem Arbeitsdateinamen

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Fri, 10 Apr 2009 17:29:55 +0200 (CEST)

Polytropon <freebsd(at)edvax.de> wrote:
> Ich möchte in einem awk-Skript die Eingabedatei definieren, aus der
> gelesen werden soll. Es ist eine CSV-Datei. Nach "man awk" gibt es
> dafür FILENAME, also schrieb ich:

FILENAME ist read-only. Du möchtest vermutlich ARGC und
ARGV setzen. Mir ist allerdings unklar, warum Du den
Namen der Eingabedatei im Script hardcoden möchtest.
(Alternativ kann man natürlich auch im BEGIN- oder END-
Block »getline« in einer Schleife aufrufen.)

> FILENAME = "blubb.csv";
> FS = ":";

Das sollte vermutlich in einem »BEGIN {...}« Block stehen.
Alles, was außerhalb von Blöcken steht, wird als Pattern
bzw. boolsche Ausdrücke interpretiert; obige Zuordnungen
sind halt immer »True« und haben eine Default-Action.
Wenn awk ein kleines bisschen cleverer wäre, sollte er
in solchen Fällen eine Warnung ausgeben.

Außerdem: Wenn es CSV-Dateien sind, dann solltest Du ","
als Separator nehmen, nicht ":". Anderenfalls sind es
keine CSV-Dateien.

> !/^#/ && (length != 0) {

/^[^#]/ ist kürzer und schneller. ;-)

Also, Folgendes sollte funktionieren:

   #!/usr/bin/awk -f

   BEGIN {
           ARGV[1] = "blubb.csv"
           ARGC = 2
           FS = ","
   }

   /^[^#]/ {
           print $1, $2, $3
           ...
   }

Nur so aus Spielerei: Man kann das gleiche auch in sh
schreiben (einfacher und kürzer als in awk):

   #!/bin/sh -

   IFS=","
   while read line; do
           set -- $line
           echo $1 $2 $3
           ...
   done < blubb.csv

Und das gleiche in Python würde wie folgt aussehen:

   #!/usr/bin/env python

   for line in file("blubb.csv"):
       if line and line[0] != "#":
           parts = line.split(",")
           print parts[0], parts[1], parts[2]
           ...

Gruß
   Olli

-- 
Oliver Fromme, secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing b. M.
Handelsregister: Registergericht Muenchen, HRA 74606,  Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsregister: Registergericht Mün-
chen, HRB 125758,  Geschäftsführer: Maik Bachmann, Olaf Erb, Ralf Gebhart
FreeBSD-Dienstleistungen, -Produkte und mehr:  http://www.secnetix.de/bsd
$ dd if=/dev/urandom of=test.pl count=1
$ file test.pl
test.pl: perl script text executable
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Fri 10 Apr 2009 - 17:30:23 CEST

search this site