Пакетный файл для удаления первых 3 строк текстового файла

Как указано в заголовке, мне нужен командный файл, чтобы удалить ПЕРВЫЕ 3 строки текстового файла.

Например:

A    
B    
C    
D    
E   
F    
G

в этом примере мне нужно удалить A, B и C вместе со строкой


person kriegy    schedule 11.07.2012    source источник
comment
[См. Эту ссылку] [1]. Надеюсь, это сработает для вас. [1]: stackoverflow.com/questions/418916/   -  person Arun Jain    schedule 11.07.2012
comment
Арун Джайн, это работает, только если вы знаете, что в очереди, я не знаю   -  person kriegy    schedule 11.07.2012


Ответы (5)


Это должно сделать это

for /f "skip=3 delims=*" %%a in (C:\file.txt) do (
echo %%a >>C:\newfile.txt    
)
xcopy C:\newfile.txt C:\file.txt /y
del C:\newfile.txt /f /q

Это воссоздает файл с удаленными первыми 3 строками.

Чтобы держать пользователя в курсе, вы можете интегрировать сообщения в пакетный файл в стиле vbscript или выводить сообщения в командной строке.

@echo off
echo Removing...
for /f "skip=3 delims=*" %%a in (C:\file.txt) do (
echo %%a >>C:\newfile.txt
) >nul
echo Lines removed, rebuilding file...
xcopy C:\newfile.txt C:\file.txt /y >nul
echo File rebuilt, removing temporary files
del C:\newfile.txt /f /q >nul
msg * Done!
exit >nul

Надеюсь это поможет.

person Bali C    schedule 11.07.2012
comment
Кажется, я столкнулся с ошибкой ›› в этот раз было неожиданным - person kriegy; 11.07.2012
comment
Извините, произошла опечатка, я поставил знак " в имени файла в цикле for, попробуйте сейчас. - person Bali C; 11.07.2012
comment
Извините, я не смог протестировать код, когда разместил его. Я отредактировал его снова и протестировал на этот раз, и он работает. Я забыл delims, поэтому он ломался, когда попадал в пробел. Попробуй сейчас. - person Bali C; 11.07.2012
comment
это заняло у нас некоторое время, но мы добрались до места, спасибо, я собираюсь задать еще один вопрос, который касается утверждений if ... yay - person kriegy; 11.07.2012
comment
Не беспокойтесь, да, в конце концов добрались! :) Хорошо, я буду следить за этим! - person Bali C; 11.07.2012
comment
@kriegy - с этим скриптом все еще есть проблемы. Строка будет обрезана до 1-го * символа. Он удалит строки, начинающиеся с ;. Он удалит пустые строки. Есть способы устранить проблемы, но есть более простое решение, используя БОЛЬШЕ - person dbenham; 11.07.2012
comment
стоит ли иметь графический интерфейс vbscript msgbox? - person kriegy; 11.07.2012
comment
@kriegy Что ты имеешь в виду? Для чего использовать почтовый ящик? - person Bali C; 11.07.2012
comment
файл, который я пишу, будет использоваться кем-то, кто не так хорош, как я (и это что-то говорит), я думал, будут ли msgboxes хороши, например: работает, делает простые вещи, я знаю минимум vbscript (крошечный бит) - person kriegy; 11.07.2012
comment
@kriegy Хорошо, см. мой ответ, я получил несколько предложений. - person Bali C; 11.07.2012
comment
Я не очень разбираюсь в VB, вы имеете в виду msgbox"Hello kriegy!" или wscript.echo("Hello") - person Bali C; 11.07.2012
comment
Я думаю, с пакетом все будет в порядке, в конце концов, это займет всего секунду, почему бы просто не поставить echo Done и pause >nul в конце, чтобы они знали, что это сделано, и могли просто закрыть его. - person Bali C; 11.07.2012

more +3 "file.txt" >"file.txt.new"
move /y "file.txt.new" "file.txt" >nul

Вышеупомянутое выполняется быстро и отлично работает со следующими ограничениями:

  • Символы TAB преобразуются в серию пробелов.
  • Количество сохраняемых строк должно быть меньше ~ 65535. MORE зависнет (дождитесь нажатия клавиши), если номер строки превышен.
  • Все строки будут заканчиваться возвратом каретки и переводом строки, независимо от того, как они были отформатированы в источнике.

Следующее решение, использующее FOR / F с FINDSTR, более надежно, но намного медленнее. В отличие от простого решения FOR / F, оно сохраняет пустые строки. Но, как и все решения FOR / F, максимальная длина строки ограничена немногим менее 8191 байта. Опять же, все строки будут завершаться возвратом каретки и переводом строки.

@echo off
setlocal disableDelayedExpsnsion
>"file.txt.new" (
  for /f "delims=" %%A in ('findstr /n "^" "file.txt"') do (
    set "ln=%%A"
    setlocal enableDelayedExpansion
    echo(!ln:*::=!
    endlocal
  )
)
move /y "file.txt.new" "file.txt" >nul

Если у вас есть моя стильная утилита обработки текста регулярных выражений JREPL.BAT, тогда вы можете использовать следующее для очень надежного и быстрого решения. Это все равно завершит все строки возвратом каретки и переводом строки (\ r \ n), независимо от исходного формата.

jrepl "^" "" /k 0 /exc 1:3 /f "test.txt" /o -

Вы можете написать терминатор строки \ n вместо \ r \ n, добавив параметр /U.

Если необходимо сохранить исходные терминаторы строк, можно использовать следующий вариант. Это загружает весь исходный файл в одну переменную JScript, поэтому общий размер файла ограничен примерно 1 или 2 гигабайтами (я забыл точное число).

jrepl "(?:.*\n){1,3}([\s\S]*)" "$1" /m /f "test.txt" /o -

Помните, что JREPL - это пакетный файл, поэтому вы должны использовать CALL JREPL, если используете команду в другом пакетном сценарии.

person dbenham    schedule 11.07.2012
comment
стоит ли иметь графический интерфейс vbscript msgbox? - person kriegy; 11.07.2012
comment
РЕДАКТИРОВАТЬ - добавлено более надежное, но медленное решение FOR / F, а также быстрые и надежные решения JREPL.BAT. - person dbenham; 29.02.2016

Используйте sed, чтобы печатать только с 4-й строки (Изменить: только если вы используете Un * x :)

$ sed -e '4,$p' in.txt 
person Community    schedule 11.07.2012
comment
Я предпочитаю, чтобы все это было родным, так как я мог бы распространить пару копий, хотя, спасибо - person kriegy; 11.07.2012
comment
Этот вопрос помечен как пакетный. Вам нужно будет получить Sed для Windows, чтобы он заработал. - person Eitan T; 11.07.2012
comment
Если я читаю ответы, в которых используется только пакетная обработка, я рекомендую это сделать :) - person ; 12.07.2012

Я использую команду "more" для вывода файла после команды n-й строки (windows)

More +n orginalfilename.txt > outputfilename.txt

Описание: Вывод файла txt после n-й строки

person Sarah Filano    schedule 23.01.2015

Если вы хотите пропустить первую и закрыть последние строки, вы можете использовать мой код по адресу http://www.harchut.de/download/ms-dos/skip-tail-flatfile-example.zip

set L_TRIMFILE_CNT=0
set L_TRIMFILE_TMPFILE=work.countrows.find.tmp
find /c /v "" %P_TRIMFILE_INFILE% > %L_TRIMFILE_TMPFILE%
for /f "skip=1 tokens=3* " %%a in (%L_TRIMFILE_TMPFILE%) do (
  if %L_TRIMFILE_CNT% == 0 set L_TRIMFILE_CNT=%%a
)
del %L_TRIMFILE_TMPFILE%
set /a L_TRIMFILE_EOF=%L_TRIMFILE_CNT%-%P_TRIMFILE_TAIL%
findstr /n .* "%P_TRIMFILE_INFILE%" > %L_TRIMFILE_TMPFILE%
if exist %P_TRIMFILE_OUTFILE% del %P_TRIMFILE_OUTFILE%
set V_TRIMFILE_SKIP="skip=%P_TRIMFILE_SKIP% tokens=1* delims=:"
if %P_TRIMFILE_SKIP% equ 0 set V_TRIMFILE_SKIP="tokens=1* delims=:"
for /f %V_TRIMFILE_SKIP% %%a in (%L_TRIMFILE_TMPFILE%) do (
  if %%a leq %L_TRIMFILE_EOF% if exist %P_TRIMFILE_OUTFILE% @echo.%%b>>%P_TRIMFILE_OUTFILE%
  if %%a leq %L_TRIMFILE_EOF% if not exist %P_TRIMFILE_OUTFILE% @echo.%%b>%P_TRIMFILE_OUTFILE%
)
del %L_TRIMFILE_TMPFILE%

Вы можете пропустить или закрыть строку плоского файла без каких-либо дополнительных утилит.

person Rob    schedule 22.05.2015
comment
Возможно, вы захотите добавить небольшое пояснение к этому ответу. Всегда лучше дать человеку удочку, чем рыбу. - person Amit; 22.05.2015