Брайан Хупер: Вы почти достигли точки, но у вас есть ошибка в вашем синакс. Ваша вставка никогда не будет работать. Я тестировал свою базу данных, и вот правильный ответ:
INSERT INTO podatki (datum,ura,meritev1,meritev1_sunki,impulzi1,meritev2,meritev2_sunki,impulzi2)
SELECT '$datum', '$ura', '$meritve1','$sunki1','$impulzi1','$meritve2','$sunki2','$impulzi2'
FROM dual
WHERE NOT EXISTS (SELECT datum,ura
FROM podatki
WHERE datum='$datum' and ura='$ura'
Я даю вам мой пример таблицы y. Вставка почти такая же, как писал Биан Хупер, за исключением того, что я помещаю select FROM DUAL ont из другой таблицы. С уважением, Иван
Попробуйте хвост :
tail -n +2 "$FILE"
-n x
: Просто распечатайте последнее x
строки. tail -n 5
дал бы Вам последние 5 строк входа. +
вид знака инвертирования аргумент и делают tail
печать что-либо кроме первого x-1
строки. tail -n +1
распечатал бы целый файл, tail -n +2
все кроме первой строки, и т.д.
, GNU tail
намного быстрее, чем [1 112]. tail
также доступно на BSD и эти -n +2
, флаг последователен через оба инструмента. Проверьте FreeBSD или OS X страницы справочника для больше.
версия BSD может быть намного медленнее, чем [1 115], все же. Интересно, как они управляли этим; tail
должен просто считать файл линию за линией, в то время как sed
делает довольно сложное операционное вовлечение, интерпретирующее сценарий, применяя регулярные выражения и т.п..
Примечание: можно испытать желание использовать
# THIS WILL GIVE YOU AN EMPTY FILE!
tail -n +2 "$FILE" > "$FILE"
, но это даст Вам пустой файл . Причина состоит в том, что перенаправление (>
) происходит, прежде tail
вызывается оболочкой:
$FILE
tail
процесс к [1 123] tail
чтения от теперь пустой $FILE
, Если Вы хотите удалить первую строку в файле, необходимо использовать:
tail -n +2 "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"
Эти &&
удостоверится, что файл не становится перезаписанным, когда существует проблема.
Действительно ли использование выследило бы на N-1 строках и предписав, чтобы в файл, сопровождаемый путем удаления старого файла и переименования нового файла к старому названию, сделали задание?
, Если бы я делал это программно, я прочитал бы файл и помнил бы файловое смещение после чтения каждой строки, таким образом, я мог стремиться назад на то положение считать файл с одним меньшим количеством строки в нем.
Так как это кажется, что я не могу ускорить удаление, я думаю, что хороший подход мог бы быть должен обработать файл в пакетах как это:
While file1 not empty
file2 = head -n1000 file1
process file2
sed -i -e "1000d" file1
end
недостаток этого состоит в том, что, если программа закрыта в середине (или если существуют некоторые плохо sql там - то, чтобы заставлять часть "процесса" умереть или тупик), будут строки, которые или пропускаются или обрабатываются дважды.
(file1 содержит строки кода SQL)
Как сказанный Мир, Вы, вероятно, не собираетесь добираться немного быстрее, чем это. Причина состоит в том, что нет почти никаких файловых систем, которые поддерживают усечение с начала файла, таким образом, это будет O (n
) операция, где n
размер файла. Что можно сделать очень быстрее, хотя перезапись первая строка с тем же числом байтов (возможно, с пробелами или комментарием), который мог бы работать на Вас в зависимости от точно, что Вы пытаетесь сделать (что это между прочим?).
Нет, это почти так эффективно, как Вы собираетесь добраться. Вы могли записать программу C, которая могла сделать задание немного быстрее (меньше времени запуска и аргументов обработки), но это будет, вероятно, склоняться к той же скорости как sed, как файлы становятся большими (и я предполагаю, что они являются большими, если требуется минута).
, Но Ваш вопрос страдает от той же проблемы как столь многие другие, в которых это предполагает решение. Если необходимо было сказать нам подробно , что Вы пытаетесь сделать скорее тогда , как , мы можем быть в состоянии предложить более оптимальный вариант.
, Например, если это - файл, который обрабатывает некоторая другая программа B, одно решение не состояло бы в том, чтобы снять изоляцию с первой строки, но изменить программу B для обработки ее по-другому.
Скажем, все Ваши программы добавляют в этот файл A, и программа B в настоящее время читает и обрабатывает первую строку прежде, чем удалить его.
Вы могли повторно спроектировать программу B так, чтобы она не пыталась удалить первую строку, но поддерживает персистентное (вероятно, основанный на файле) смещение в файл A так, чтобы, в следующий раз она работала, она могла искать на то смещение, обработать строку там и обновить смещение.
Затем в спокойное время (полночь?), это могло сделать специальную обработку файла A, чтобы удалить все строки, в настоящее время обрабатываемые и задержать смещение к 0.
Это, конечно, будет быстрее для программы, чтобы открыть и искать файл, а не открытый и перезапись. Это обсуждение предполагает, что Вы управляете программой B, конечно. Я не знаю, если это так, но могут быть другие возможные решения, если Вы предоставляете дополнительную информацию.
Как насчет того, чтобы использовать csplit?
man csplit
csplit -k file 1 '{1}'
If what you are looking to do is recover after failure, you could just build up a file that has what you've done so far.
if [[ -f $tmpf ]] ; then
rm -f $tmpf
fi
cat $srcf |
while read line ; do
# process line
echo "$line" >> $tmpf
done