2012-07-11 51 views
9

Como dice el título, necesito un archivo por lotes para eliminar las PRIMERAS 3 líneas de un archivo de texto.Archivo por lotes para eliminar las primeras 3 líneas de un archivo de texto

por ejemplo:

A  
B  
C  
D  
E 
F  
G 

en este ejemplo que necesito A, B y C eliminado junto con la línea de

+0

[Ver este enlace] [1]. Espero que funcione para ti. [1]: http://stackoverflow.com/questions/418916/delete-certain-lines-in-a-txt-file-via-a-batch-file –

+0

Arun Jain que sólo funciona si usted sabe lo que está en la línea no lo hago – kriegy

Respuesta

11

Esto debe hacerlo

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 

que se vuelva a crear la archivo con las 3 primeras líneas eliminadas.

Para mantener al usuario actualizado, puede integrar los mensajes en el archivo por lotes en el estilo de vbscript o mensajes de salida en el símbolo del sistema.

@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 

Espero que esto ayude.

+0

parece que me encontré con un error ">> no se esperaba en este momento" – kriegy

+0

Lo siento, había un error tipográfico, había puesto un signo '" 'en el nombre del archivo en el bucle 'for', inténtalo ahora –

+0

ok que devolvió la primera palabra en LASTAS 3 líneas – kriegy

3

usar sed que sólo quiere imprimir a partir de la cuarta línea (Editar: Sólo si se utiliza Un * x :)

$ sed -e '4,$p' in.txt 
+0

prefiero mantenerlo todo nativo, ya que podría distribuir un par de copias, gracias – kriegy

+0

Esta pregunta está etiquetada como [etiqueta: lote]. Tendrás que obtener [Sed para Windows] (http://gnuwin32.sourceforge.net/packages/sed.htm) para que funcione. –

+0

Si leo las respuestas que solo usan lotes, recomiendo hacer eso :) –

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

Lo anterior es rápido y funciona muy bien, con las siguientes limitaciones :

  • Los caracteres TAB se convierten en una serie de espacios.
  • El número de líneas a preservar debe ser menor que ~ 65535. MÁS se bloqueará, (espere a que se presione una tecla), si se excede el número de línea.
  • Todas las líneas finalizarán mediante el retorno de carro y el avance de línea, independientemente de cómo hayan sido formateados en la fuente.

La siguiente solución que utiliza FOR/F con FINDSTR es más robusta, pero es mucho más lenta. A diferencia de una solución FOR/F simple, conserva líneas vacías. Pero como todas las soluciones FOR/F, está limitada a una longitud de línea máxima de un bit menor que 8191 bytes. Nuevamente, todas las líneas terminarán por retorno de carro y avance de línea.

@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 

Si usted tiene mi práctico-excelente JREPL.BAT regex text processing utility, entonces se podría usar lo siguiente para una solución muy robusta y rápida. Esto aún terminará todas las líneas con retorno de carro y salto de línea (\ r \ n), independientemente del formato original.

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

Se puede escribir \ n terminaciones de línea en lugar de \ r \ n añadiendo la opción /U.

Si debe conservar los terminadores de línea originales, puede usar la siguiente variación. Esto carga todo el archivo de origen en una sola variable de JScript, por lo que el tamaño total del archivo está limitado a aproximadamente 1 o 2 gigabytes (olvidé el número exacto).

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

Recuerde que JREPL es un archivo por lotes, por lo que debe utilizar LLAMADA JREPL si utiliza el comando dentro de otro archivo por lotes.

+0

¿Vale la pena tener vbscript msgbox GUI? – kriegy

+0

no se preocupe, lo resolví – kriegy

+0

EDITAR - Agregué una solución FOR/F más robusta pero lenta, así como soluciones JREPL.BAT rápidas y robustas. – dbenham

1

utilizo comando "más" para el archivo outting después enésima línea Comando (ventanas)

More +n orginalfilename.txt > outputfilename.txt 

Descripción: archivo de txt Dar salida después de la línea enésima

0

Si desea omitir la primera y las últimas líneas de cola, puede utilizar mi código en 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% 

puede omitir o línea de cola de un archivo plano sin ninguna utilidad adicional.

+1

Es posible que desee agregar una pequeña explicación sobre esta respuesta. Siempre es mejor darle a una persona una caña de pescar que darle un pez. – Amit

Cuestiones relacionadas