Am 01.08.2012 18:43, schrieb Ronny Seffner:
cat "$FILE" | while read ENTRY; do YEAR=`echo "$ENTRY" | awk '{print $1}' | awk -F. '{print $3}'` MONTH=`echo "$ENTRY" | awk '{print $1}' | awk -F. '{print $2}'` DAY=`echo "$ENTRY" | awk '{print $1}' | awk -F. '{print $1}'` TIMESTAMP=`echo "$ENTRY" | awk '{print $2}'` NEWDATE="$YEAR-$MONTH-$DAY $TIMESTAMP" # VALUE=`echo "$ENTRY" | awk '{ print $3 }' | sed -e 's/,/./g'` VALUE=`echo "$ENTRY" | awk '{ print $3 }'` SQL="INSERT INTO `test` (`timestamp`, `value`) VALUES ('$NEWDATE', '$VALUE') ON DUPLICATE KEY UPDATE `timestamp`= '$NEWDATE', value = '$VALUE';" mysql machines -uroot -p$SQLPWD -e "$SQL" done
Ich denke hier jedes Mal mehrere awk und sed zu starten nur um das unglückliche Datumsformat zu verändern muss nicht sein. Leider kann ich kein perl, das soll ja Wunder wirken ...
Aber auch ohne die Datumskonvertierung ist das alles nicht wirklich schnell. Die my.cnf ist noch UBUNTU Standard und vielleicht sind so viele kleine INSERTS auch gar nicht wirklich gut?
Vielleicht… Aber vielleicht solltest Du auch nicht jedesmal mysql neu starten. Wenn Du schon sed verwendest, kannst Du auch gleich alles mit sed machen:
(cat prepare-insert.sql
sed -e \ "s"\ "%"\ "([0-9]+)[.:]([0-9]+)[.:]([0-9]+)[ \t]+([0-9:.]+)[ \t]+([0-9]*)[,.]([0-9]*)"\ "%"\ "INSERT INTO `test` (`timestamp`, `value`) "\ "VALUES ('\3-\2-\1 \4','\5.\6')"\ " ON DUPLICATE KEY "\ "UPDATE `timestamp`= '\3-\2-\1 \4', `value` ='\5.\6';"\ "%" \ "$FILE" ;
cat after-insert.sql ) | mysql machines -uroot -p$SQLPWD
Du kannst auch awk mit printf benutzen da kannst Du Dir auch jede Zeile mit einem ähnlichen oder demselben (ich weiß immer nicht wann wo Backlashes gesetzt werden müssen) regulären Ausdruck auseinandernehmen lassen. Du kannst auch das „Skript“ in eine Extradatei speichern.
Die beiden Dateien kannst Du dann noch benutzen um Zeugs drumrum zu basteln. Z.B. die Indizes während der Inserts ausschalten. Beim Einschalten werden sie dann aktualisiert. Das macht mysqldump auch so.
Tobias