2012-07-11 9 views
9

W tytule podano, że potrzebuję pliku wsadowego, aby usunąć PIERWSZE 3 wiersze pliku tekstowego.Plik wsadowy do usunięcia pierwszych 3 wierszy pliku tekstowego

na przykład:

A  
B  
C  
D  
E 
F  
G 

w tym przypadku muszę A, B i C usunięty wraz z linią

+0

[Zobacz ten link] [1]. Mam nadzieję, że zadziała dla Ciebie. [1]: http://stackoverflow.com/questions/418916/delete-certain-lines-in-a-txt-file-via-a-batch-file –

+0

Arun Jain, który działa tylko wtedy, gdy wiesz, co jest w linii i nie mam błędu – kriegy

Odpowiedz

11

ten powinien zrobić to

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 

To będzie odtworzyć plik z usuniętymi pierwszymi trzema liniami.

Aby zachować aktualność użytkownika, można integrować wiadomości w pliku wsadowym w stylu vbscript lub komunikaty wyjściowe w wierszu polecenia.

@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 

Mam nadzieję, że to pomoże.

+0

"Błąd był" "nie sprawdzony w tej chwili" – kriegy

+0

Przepraszam, był błąd literowy, umieściłem znak "" w nazwie pliku w pętla 'for', spróbuj teraz –

+0

ok, która zwróciła pierwsze słowo na OSTATNICH 3 liniach – kriegy

3

Zastosowanie sed do drukowania tylko począwszy od 4 linii (Edit: Tylko jeśli używasz Un * x :)

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

wolę zachować wszystko rodzime, ponieważ mogę rozdać kilka kopii dziękuję – kriegy

+0

To pytanie jest oznaczone jako [tag: batch]. Będziesz musiał dostać [Sed for windows] (http://gnuwin32.sourceforge.net/packages/sed.htm), aby to działało. –

+0

Jeśli czytam odpowiedzi, które używają tylko partii, polecam to zrobić :) –

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

Powyższe jest szybki i działa świetnie, z następującymi ograniczeniami :

  • Znaki TAB są konwertowane na serię spacji.
  • Liczba linii, które należy zachować, musi być mniejsza niż ~ 65535. WIĘCEJ zostanie zawieszony (poczekaj na naciśnięcie klawisza), jeśli przekroczony zostanie numer linii.
  • Wszystkie linie zostaną zakończone przez powrót karetki i linefeed, niezależnie od tego, w jaki sposób zostały sformatowane w źródle.

Poniższe rozwiązanie wykorzystujące FOR/F z FINDSTR jest bardziej niezawodne, ale jest znacznie wolniejsze. W przeciwieństwie do prostego rozwiązania FOR/F zachowuje puste linie. Ale podobnie jak wszystkie rozwiązania FOR/F, jest ograniczona do maksymalnej długości linii nieco mniejszej niż 8191 bajtów. Ponownie, wszystkie linie zostaną zakończone przez powrót karetki i powrót do linii.

@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 

Jeśli masz mój handy-dandy JREPL.BAT regex text processing utility, następnie można użyć następujących za bardzo solidnego i szybkiego rozwiązania. To nadal spowoduje zakończenie wszystkich wierszy z powrotem karetki i wprowadzeniem wiersza (\ r \ n), niezależnie od oryginalnego formatu.

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

Możesz napisać \ n terminatory linii zamiast \ r \ n dodając opcję /U.

Jeśli zachowujesz oryginalne terminatory linii, możesz użyć następującej odmiany. Spowoduje to załadowanie całego pliku źródłowego do pojedynczej zmiennej JScript, więc całkowity rozmiar pliku jest ograniczony do około 1 lub 2 gigabajtów (nie pamiętam dokładnej liczby).

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

Pamiętaj, że JREPL jest plik wsadowy, więc trzeba użyć CALL JREPL jeśli użyć polecenia w innym skrypcie.

+0

czy warto mieć GUI msgbox vbscript? – kriegy

+0

Nie martw się, rozwiązałem to. – kriegy

+0

EDYCJA - Dodano bardziej stabilne, ale wolne rozwiązanie FOR/F, a także szybkie i niezawodne rozwiązania JREPL.BAT. – dbenham

1

używam „więcej” polecenia dla pliku outting po n-ty wiersz poleceń (Windows)

More +n orginalfilename.txt > outputfilename.txt 

Opis: Wyprowadzanie plik txt po n-tym wierszu

0

Jeśli chcesz pominąć pierwszy i ogon ostatnie wiersze, można użyć mojego kodu na 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% 

można pominąć lub linii końcowej pliku płaskiego bez dodatkowego narzędzia.

+1

Możesz dodać trochę wyjaśnienia na temat tej odpowiedzi. Zawsze lepiej dać osobie wędkę niż dać mu rybę. – Amit

Powiązane problemy