OSX, G/AWK, BASH - "Illegale Aussage, Untermin -Zeichenfolge" und keine Dateiausgabe
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
Lösung
Ich sehe zwei Probleme (auf OS X -Plattform):
- Der awk -Befehl unter OS X unterstützt das -V -Flag nicht. Wir können es mit dem Startmuster beheben.
- 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