Как я могу удалить первую строку текстового файла, используя скрипт bash / sed?

Брайан Хупер: Вы почти достигли точки, но у вас есть ошибка в вашем синакс. Ваша вставка никогда не будет работать. Я тестировал свою базу данных, и вот правильный ответ:

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 из другой таблицы. С уважением, Иван

490
задан Peter Coulton 15 September 2011 в 01:18
поделиться

7 ответов

Попробуйте хвост :

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 вызывается оболочкой:

  1. Shell усекает файл $FILE
  2. , Shell создает новый процесс для [1 121]
  3. , Shell перенаправляет stdout эти tail процесс к [1 123]
  4. tail чтения от теперь пустой $FILE

, Если Вы хотите удалить первую строку в файле, необходимо использовать:

tail -n +2 "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"

Эти && удостоверится, что файл не становится перезаписанным, когда существует проблема.

919
ответ дан kirelagin 15 September 2011 в 01:18
поделиться

Действительно ли использование выследило бы на N-1 строках и предписав, чтобы в файл, сопровождаемый путем удаления старого файла и переименования нового файла к старому названию, сделали задание?

, Если бы я делал это программно, я прочитал бы файл и помнил бы файловое смещение после чтения каждой строки, таким образом, я мог стремиться назад на то положение считать файл с одним меньшим количеством строки в нем.

-1
ответ дан EvilTeach 15 September 2011 в 01:18
поделиться

Так как это кажется, что я не могу ускорить удаление, я думаю, что хороший подход мог бы быть должен обработать файл в пакетах как это:

While file1 not empty
  file2 = head -n1000 file1
  process file2
  sed -i -e "1000d" file1
end

недостаток этого состоит в том, что, если программа закрыта в середине (или если существуют некоторые плохо sql там - то, чтобы заставлять часть "процесса" умереть или тупик), будут строки, которые или пропускаются или обрабатываются дважды.

(file1 содержит строки кода SQL)

1
ответ дан Brent 15 September 2011 в 01:18
поделиться

Как сказанный Мир, Вы, вероятно, не собираетесь добираться немного быстрее, чем это. Причина состоит в том, что нет почти никаких файловых систем, которые поддерживают усечение с начала файла, таким образом, это будет O (n) операция, где n размер файла. Что можно сделать очень быстрее, хотя перезапись первая строка с тем же числом байтов (возможно, с пробелами или комментарием), который мог бы работать на Вас в зависимости от точно, что Вы пытаетесь сделать (что это между прочим?).

9
ответ дан Robert Gamble 15 September 2011 в 01:18
поделиться

Нет, это почти так эффективно, как Вы собираетесь добраться. Вы могли записать программу C, которая могла сделать задание немного быстрее (меньше времени запуска и аргументов обработки), но это будет, вероятно, склоняться к той же скорости как sed, как файлы становятся большими (и я предполагаю, что они являются большими, если требуется минута).

, Но Ваш вопрос страдает от той же проблемы как столь многие другие, в которых это предполагает решение. Если необходимо было сказать нам подробно , что Вы пытаетесь сделать скорее тогда , как , мы можем быть в состоянии предложить более оптимальный вариант.

, Например, если это - файл, который обрабатывает некоторая другая программа B, одно решение не состояло бы в том, чтобы снять изоляцию с первой строки, но изменить программу B для обработки ее по-другому.

Скажем, все Ваши программы добавляют в этот файл A, и программа B в настоящее время читает и обрабатывает первую строку прежде, чем удалить его.

Вы могли повторно спроектировать программу B так, чтобы она не пыталась удалить первую строку, но поддерживает персистентное (вероятно, основанный на файле) смещение в файл A так, чтобы, в следующий раз она работала, она могла искать на то смещение, обработать строку там и обновить смещение.

Затем в спокойное время (полночь?), это могло сделать специальную обработку файла A, чтобы удалить все строки, в настоящее время обрабатываемые и задержать смещение к 0.

Это, конечно, будет быстрее для программы, чтобы открыть и искать файл, а не открытый и перезапись. Это обсуждение предполагает, что Вы управляете программой B, конечно. Я не знаю, если это так, но могут быть другие возможные решения, если Вы предоставляете дополнительную информацию.

17
ответ дан paxdiablo 15 September 2011 в 01:18
поделиться

Как насчет того, чтобы использовать csplit?

man csplit
csplit -k file 1 '{1}'
4
ответ дан Shahbaz 15 September 2011 в 12:18
поделиться

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
0
ответ дан 22 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: