web-dev-qa-db-ja.com

テキストファイルの最初の3行を削除するバッチファイル

タイトルのとおり、テキストファイルの最初の3行を削除するバッチファイルが必要です。

例えば:

A    
B    
C    
D    
E   
F    
G

この例では、A、B、Cを行とともに削除する必要があります

10
kriegy

これはそれをするべきです

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

お役に立てれば。

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

上記は高速で動作しますが、次の制限があります。

  • TAB文字は一連のスペースに変換されます。
  • 保存する行数は〜65535未満にする必要があります。行番号を超えると、MOREがハングします(キーが押されるのを待ちます)。
  • ソースでの形式に関係なく、すべての行はキャリッジリターンとラインフィードで終了します。

FINDSTRでFOR/Fを使用する次のソリューションは、より堅牢ですが、速度がはるかに遅くなります。単純な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 regexテキスト処理ユーティリティ を持っている場合は、非常に堅牢で高速なソリューションのために以下を使用できます。これにより、元の形式に関係なく、すべての行がキャリッジリターンとラインフィード(\ r\n)で終了します。

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

/Uオプションを追加することにより、\ r\nの代わりに\ n行ターミネータを書くことができます。

元の行末記号を保持する必要がある場合は、次のバリエーションを使用できます。これにより、ソースファイル全体が単一のJScript変数に読み込まれるため、合計ファイルサイズは約1または2ギガバイトに制限されます(正確な数を忘れてしまいました)。

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

JREPLはバッチファイルであるため、別のバッチスクリプト内でコマンドを使用する場合は、CALL JREPLを使用する必要があることに注意してください。

16
dbenham

Sedを使用して、4行目からのみ印刷する(Edit: Un * xを使用する場合のみ:)

$ sed -e '4,$p' in.txt 
3
user647772

N行目のコマンドの後にファイルを送信するために「more」コマンドを使用します(Windows)

More +n orginalfilename.txt > outputfilename.txt

説明:n行目以降のtxtのファイルを出力

1
Sarah Filano

最初の行をスキップして最後の行をテールする場合は、 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%

追加のユーティリティを使用せずに、フラットファイルの行をスキップまたはテールできます。

0
Rob