Archiv verlassen und diese Seite im Standarddesign anzeigen : AWK: best. Spalte mit Wert Multiplizieren
rubinski
23-01-2007, 20:30
Hallo, ich möchte in einer kommagetrennten Textdatei alle Spalten untersuchen und für den Fall, daß dort in einer Zeile Werte auftauchen, die NICHT 5-Stellig, sondern sagen wir 3- oder 4-Stellig sind mit 10 bzw. 100 multiplizieren.
so sieht ein Ausschnitt der betreffenden Dateien aus:
01182007,0932,11692,11701,11692,1170
01182007,0933,1170,1170,11692,11692
01182007,0934,11692,11695,11691,11694
01182007,0935,11695,11704,11695,11704
Die beiden unteren Zeilen würden demnach den Kriterien entsprechen, aber in Zeile 1 wäre die letzte und in Zeile 2 die ersten beiden Spalten jeweils mit 10 zu multiplizieren.. ist sowas mit AWK machbar?
Wäre toll, wenn mir jemand helfen könnte, bin nämlich absoluter Neuling auf dem Gebiet.. übrigens super Board hier, hab schon den einen oder anderen Tipp zu Sed und Co. hier gefunden..
Hallo rubinski,
es geht sicher mit awk, geht aber auch ohne, einfach in der bash die Nullen für die Spalten 3 bis 6 anhängen, aber nur 5-stellig ausgeben.
Gruss zst
#!/bin/bash
while read ZL
do
sp12=$(echo $ZL | cut -d"," -f1,2)
sp3=$(echo $ZL | cut -d"," -f3)0000
sp4=$(echo $ZL | cut -d"," -f4)0000
sp5=$(echo $ZL | cut -d"," -f5)0000
sp6=$(echo $ZL | cut -d"," -f6)0000
printf "%s,%s,%s,%s,%s\n" $sp12 ${sp3:0:5} ${sp4:0:5} ${sp5:0:5} ${sp6:0:5}
done < ./rubinski.csv
rubinski
23-01-2007, 22:27
hallo zst, bin wirklich Neuling und Windoof-Nutzer dazu.. was ist das für eine Sprache, Perl? Wie rufe ich das denn konkret auf bzw. binde das in eine Batch dann ein? Das Problem ist auch, daß die Datei nicht bloß aus 6 Zeilen, sondern hunderten besteht und zudem gut 3 Dutzend dieser Dateien manipuliert werden müssten..
Hallo rubinski,
die Zeilenzahl ist egal. Es wird solange gelesen, bis die (hier im Beispiel "rubinski.csv") angegebene Datei zu Ende ist.
Diesen Code als SHELL-Script in Datei speichern, ausführbar machen und ganz normal in der bash aufrufen. Den Dateinamen musst Du anpassen. Die Ausgabe erfolgt auf Bildschirm, einfach in neue Datei umleiten.
Du kannst das dann für alle Dateien in einer Schleife machen.
Aber vielleicht hat ja noch jemand, Deinen Wünschen entsprechend, eine awk-Idee. Aber ob die schneller ist ...
Gruss zst
rubinski
23-01-2007, 22:56
Diesen Code als SHELL-Script in Datei speichern, ausführbar machen und ganz normal in der bash aufrufen.
.. und genau da hapert´s bei mir schon.. ich hab keine Ahnung, wie sich das hier in einer Windows-Umgebung einbinden lässt. Ist es nun Perl?
Ich hab hier die GnuUtils (sed, sort, grep, cat und co.) installiert und lerne gerade die ersten Schritte gehen mit den Tools. Textmanipulationen im Sinne von Sortieren, Löschen und Ersetzen beherrsche ich schon einigermaßen, das was ich da nun vorhabe scheint mir halt auf awk hinauszulaufen. Und awk wiederum ist relativ schwierig für jemanden, der im Alltag eigentlich nichts programmiert..
Hallo rubinski,
es ist nicht Perl !
So ein bash-Script läuft i.d.R. auf jedem LINUX-Rechner.
Aber Deine Windows-GnuUtils kenne ich nicht ...
Gruss zst
rubinski
23-01-2007, 23:25
Aber Deine Windows-GnuUtils kenne ich nicht ...
ok, kein Problem. Vielen Dank einstweilen für dein Bemühen, vielleicht findet sich ja noch ein User ein, dem zu der Fragestellung eine Lösung mit AWK einfällt. Ich möchte hier sowieso bald mal Linux ausprobieren..
undefined
24-01-2007, 07:35
Das Script von zst sollte auch mit den Unixutils laufen. (MinGw Homepage ich glaube MSYS)
Hier dein awk Beispiel
echo "01182007,0932,11692,11701,11692,1170" | awk -F',' '{printf "%05d#%05d#%05d#%05d#%05d\n", $0, $1, $2, $3, $4, $5}'
rubinski
24-01-2007, 09:16
hallo undefined.. PHP? Kenne ich mich nicht mit aus.. ich arbeite hier, wie gesagt in einer Windows-Umgebung. Die Input-Dateien kommen von Windows Programmen und werden auch in Windows Programmen Verwendung finden.
Bei mir müsste dein Code so aussehen, wenn ich das richtig verstehe:
gawk -F, "{printf "%05d#%05d#%05d#%05d#%05d\n", $0, $1, $2, $3, $4, $5}" in.txt > out.txt
Die doppelten Gänsefüßchen muss ich unter Windows verwenden, da die einfachen Hochkommata nicht interpretiert werden können..
Nur, will es hier nicht funktionieren... Das Script von zst verstehe ich leider nicht, weshalb mir der Zusammenhang zwischen deinem Einzeiler und seiner BASH nicht klar ist... entschuldigt meinen Dillentantismus..
undefined
24-01-2007, 11:48
@PHP Code:
das ist nur hier im forum der Titel für das Syntax Highlight ;)
Die doppelten Gänsefüßchen muss ich unter Windows verwenden, da die einfachen Hochkommata nicht interpretiert werden können
Dann hast du damit ein schweres Problem, der awk Befehl braucht das. ;)
Also du kannst nicht einen Befehl auf ein ganzes File senden wenn du einzelne Zeilen Ändern und Formatieren möchtest da braucht du definitive eine Schleife siehe zst Script.
oder
for i in `cat in.txt` ; do
echo $i | awk -F',' '{printf "%05d,%05d,%05d,%05d,%05d\n", $0, $1, $2, $3, $4, $5}' >> out.txt
done
rubinski
24-01-2007, 12:54
Dann hast du damit ein schweres Problem, der awk Befehl braucht das
fürchte ich auch.. jedenfalls wird der obenstehende Code, wenn ich diesen in einer Batchdatei speichere (test.bat) in keinster Weise ausgeführt. Es wird nicht einmal eine leere out.txt erstellt..
Ich habe hier gawk aus den GnuUtils, wie man aus meinem Posting um 10:16 Uhr entnehmen kann. Vielleicht gibt es ja doch eine andere Syntax für deinen Code?
undefined
24-01-2007, 14:13
Dann Installiere dir die MSYS und schreibe ein Shell Script
Du kannst unter Windows ohne Cygwin kein bash verwenden.
Nehme statt dessen sh die bestandteil von MSYS ist.
#!/bin/sh
for i in `cat in.txt` ; do
echo $i | awk -F',' '{printf "%05d,%05d,%05d,%05d,%05d\n", $0, $1, $2, $3, $4, $5}' >> out.txt
done
Und Vergiss bat und DOS - die können nicht mal ein drittel von dem was die unix shell kann ;)
rubinski
24-01-2007, 15:45
Und Vergiss bat und DOS - die können nicht mal ein drittel von dem was die unix shell kann
wenn ich dich richtig verstanden habe, dann kann man die Unix Shell unter Windows simulieren und dazu bräuchte ich Cygwin oder dieses Msys? Was bedeutet SH? Wäre nett, wenn du mir dazu ein paar Erläuterungen geben könntest und ein paar Links. Gruß
Edit:
nachdem ich gegoogelt habe, bin ich schon fündig geworden..
http://www.tanmar.info/content/view/24/47/
... vielleicht kannst du mich noch aufklären, wofür SH steht..
undefined
24-01-2007, 16:36
Das ist das schöne wenn man Linux hat da gibt man in der Console man sh oder im Konqueror man:sh ein und schon spuckt man dir die Info aus:)
sh - shell, the standard command language interpreter
The sh utility is a command language interpreter that shall execute commands read from a command line string, the standard input, or a specified file. The application shall ensure that the commands to be executed are expressed in the language described in Shell Command Language .
http://www.tu-berlin.de/zrz/dienste/www/manpages/sh.html
Du brauchst kein Cygwin MSYS reicht aus - ich habe auf meine Lapptop auch kein Cygwin und nutze Shell Scripte zum Kompilieren
rubinski
24-01-2007, 18:22
Du brauchst kein Cygwin MSYS reicht aus - ich habe auf meine Lapptop auch kein Cygwin und nutze Shell Scripte zum Kompilieren
ich müsste mir also diese Datei hier ziehen, ist das korrekt?
http://prdownloads.sf.net/mingw/MSYS-1.0.10.exe?download
von dieser Seite:
http://www.mingw.org/download.shtml
undefined
24-01-2007, 22:10
Ja - Installiere es zum Beispiel nach C:\GNU und setzte mit.
Rechte Maustate auf den Arbeitsplatz Icon Eigenschaften unter der Kategorie Umgebungsvariablen (genau wo weiss ich moment auch nicht mehr :) ). Bei der Variable PATH den Pfad zu den Binarys(exe) Dateien von MSYS. Neu Booten und danach in der Konsole sh --help zum testen eingeben.
rubinski
25-01-2007, 09:21
Hallo nochmal. Sorry, aber ich fühl mich momentan etwas überfordert.. habe nun dieses Ming32 installiert und dort folgende Zeile eingegeben:
echo "01182007,0932,11692,11701,11692,1170" | awk -F',' '{printf "%05d#%05d#%05d#%05d#%05d\n", $0, $1, $2, $3, $4, $5}'
etwas weiter unten sieht man dann, was dabei herauskam..
http://img405.imageshack.us/img405/2372/20070125ming329va.gif
Wie ich aber nun diese Bash als Datei ausführbar machen soll ist mir weiter ein Rätsel.. ich meine, ich muss das doch unter Windows irgendwie aufrufen?
Mir fiel da nicht viel mehr ein, als den Inhalt der Bash in eine .bat zu schreiben, was aber nichts bewirkt hat. Ich komme da ohne Hilfe nicht mehr weiter, oder ich probier doch dieses Cygwin..
undefined
25-01-2007, 16:44
Windows kennt kein chmod daher ist das nicht erheblich.
Zum Scripting - hier gibt es einen sehr guten Crash Kurs http://www.cyberciti.biz/nixcraft/linux/docs/uniqlinuxfeatures/lsst/
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.