OSX, G/AWK, BASH - "Illegale Aussage, Untermin -Zeichenfolge" und keine Dateiausgabe

StackOverflow https://stackoverflow.com/questions/2629957

  •  26-09-2019
  •  | 
  •  

Frage

Ich habe ein Skript, das jemand so freundlich zur Lösung eines Problems zur Verfügung gestellt hatte, das ich hatte. Ich habe jedoch einige Probleme, es zum Laufen von OSX zu liefern.

gawk --version
GNU Awk 3.1.6

awk --version
awk version 20100208

Die ursprüngliche Quelle ist:

awk -F, -vOFS=, -vc=1 '
NR == 1 {
    for (i=1; i<NF; i++) {
        if ($i != "") {
            g[c]=i;
            f[c++]=$i
        }
    }
}
NR>2 {
    for (i=1; i < c; i++) {
        print $1,$2, $g[i] > "output_"f[i]".csv
    }
}' data.csv

Wenn ich das Skript ausführe, gibt es den folgenden Fehler:

awk: syntax error at source line 12
context is print $1,$2, $g[i] > >>>  "output_"f <<< [i]".csv
awk: illegal statement at source line 13

Aus dem Aussehen wurde die Variable von [i] nicht in die Ausgabedatei geändert, aber ich weiß nicht warum.

Wenn ich awk zu gawk ändere und das ursprüngliche Skript ausführe, ist hier die Ausgabe:

gawk: cmd. line:11:             print $1,$2, $g[i] > "output_"f[i]".csv
gawk: cmd. line:11:                                               ^ unterminated string

Daher bearbeite ich die entsprechende Zeile, um die nicht entleverte Zeichenfolge zu beheben

print $1,$2, $g[i] > "output_"f[i]".csv"

Dann erzeugt es keine Fehler, aber es gibt keine Ausgabedateien.

Irgendwelche Ideen? Ich habe den größten Teil der letzten Nacht und heute Morgen damit verbracht.

Eine Beispieleingabedatei:

,,L1,,,L2,,,L3,,,L4,,,L5,,,L6,,,L7,,,L8,,,L9,,,L10,,,L11,
Title,r/t,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,neede d,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst
EXAMPLEfoo,60,6,6,6,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
EXAMPLEbar,30,6,6,12,6,7,14,6,6,12,6,6,12,6,8,16,6,7,14,6,7.5,15,6,6,12,6,8,16,6,0,0,6,7,14
EXAMPLE1,60,3,3,3,3,5,5,3,4,4,3,3,3,3,6,6,3,4,4,3,3,3,3,4,4,3,8,8,3,0,0,3,4,4
EXAMPLE2,120,6,6,3,0,0,0,6,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
EXAMPLE3,60,6,6,6,6,8,8,6,6,6,6,6,6,0,0,0,0,0,0,6,8,8,6,6,6,0,0,0,0,0,0,0,10,10
EXAMPLE4,30,6,6,12,6,7,14,6,6,12,6,6,12,3,5.5,11,6,7.5,15,6,6,12,6,0,0,6,9,18,6,0,0,6,6.5,13

Und das Beispiel sollte sein

Für L1 würde ein Beispiel für L1 so aussehen wie:

EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6

Und für L2:

EXAMPLEfoo,60,0
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,0
EXAMPLE3,60,6
EXAMPLE4,30,6
War es hilfreich?

Lösung

Ich sehe zwei Probleme (auf OS X -Plattform):

  1. Der awk -Befehl unter OS X unterstützt das -V -Flag nicht. Wir können es mit dem Startmuster beheben.
  2. Das OS X AWK mag die Art und Weise, wie die Ausgabedatei in der Druckzeile erstellt wurde.

Hier ist meine Lösung, die sowohl auf Mac OS X Snow Leopard als auch auf Red Hat Linux 4.x zu funktionieren scheint:

awk -F, '
BEGIN { OFS=","; c=1 } # FIX problem 1
NR == 1 {
    for (i=1; i<NF; i++) {
        if ($i != "") {
            g[c]=i;
            f[c++]=$i
        }
    }
}
NR>2 {
    for (i=1; i < c; i++) {
        outfile=sprintf("output_%s.csv", f[i]) # FIX problem 2
        print $1,$2, $g[i] > outfile
    }
}' data.csv
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top