web-dev-qa-db-ja.com

単一のWindowsコマンドを使用してファイルからN行を抽出する

ファイルから最初のX行の行を抽出/コピーし、Windowsコマンドプロンプトを使用して単一のコマンドで別のファイルに入力する方法はありますか?

以下を使用して、最初のX行の行を削除できます。
more + X [ファイルを含むデータ]> [ファイル_to_export_data_to]

Headコマンドが機能する場合、私はこれを行うことができると思います:
head -X [ファイルを含むデータ]> [ファイル_to_export_data_to]

しかし、残念ながらそれは機能しません。

Windowsに「少ない」コマンドがあったとしても、幸運はありませんでした。

私はこのことに関しては完全に初心者なので、明らかな何かを見逃していると確信しています。コマンドプロンプト以外のものをインストールしたり使用したりしません。

ありがとう

12
user1769292

最も簡単なワンコマンドソリューションは、Powershell Get-Contentを使用することです。

N-行数。

ファイルの先頭から:

Get-Content -Head N file.txt

ファイルの終わりから:

Get-Content -Tail N file.txt
19
Janusz

PowerShellは、cmd.exeコンソールから使用できます。

 powershell -command "& {get-content input.txt|select-object -first 10}" >output.txt

DOSKEYマクロを作成して、コマンドラインから使いやすくすることができます。

doskey head=powershell -command "& {get-content $1|select-object -first $2}"

使用法:

head input.txt 10 >output.txt

ただし、バッチスクリプト内でDOSKEYマクロを使用することはできません。

代わりにhead.batスクリプトを作成して、PATHに含まれるフォルダーに配置できます。

head.bat

@powershell -command "& {get-content %1|select-object -first %2}"

コマンドラインから、head input.txt 10 >output.txtを使用します

バッチスクリプト内から、call head input.txt 10 >output.txtを使用します

ファイルに書き込むのではなく、単に画面に結果を表示する場合に備えて、出力ファイルをパラメーターとして使用しないことを選択しました。

17
dbenham
(@FOR /f "tokens=1* delims=:" %a IN ('findstr /n "^" "standardwaffle.txt"') DO @IF %a leq 7 ECHO(%b)>u:\junk.txt

standardwaffle.txtの最初の7行をu:\junk.txtに抽出するので、ここではcmd行になりますが、確実に入力することはできません。

また、ソース行の先頭の:も削除されます。

@ECHO OFF
SETLOCAL
IF %1 lss 0 (SET /a line=-%1) ELSE (SET /a line=%1)
FOR /f "tokens=1* delims=:" %%a IN ('findstr /n "^" "%~2"') DO IF %%a leq %line% ECHO(%%b

GOTO :EOF

パス上の任意の場所に配置されたhead.batとして保存されたこのバッチを使用すると、

head -n standardwaffle.txt >junk.txt

standardwaffle.txtの最初のn行をjunk.txtに抽出します

-はオプションです

butこれには、マシンへのバッチのインストールが含まれます。それは「インストールなし」の要件によって禁止されていますか、それとも「インストール」はサードパーティのユーティリティのみを対象としていますか?

2
Magoo
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
x = 0
    Do Until Inp.AtEndOfStream
              x = x + 1
        OutP.WriteLine Inp.Readline
              If x = 5 then Exit Do
    Loop

これにより、行1〜5が印刷されます。

cscript //nologo <path to script.vbs> <inputfile >outputfile
1
Serenity

正しいutf8出力を取得するには、powershellで以下を実行します

chcp 65001

$OutputEncoding = New-Object -typename System.Text.UTF8Encoding

get-content input.txt -encoding UTF8 |select-object -first 10000 > output.txt

これにより、input.txt(utf8形式のファイル)の最初の10000行が、正しいエンコーディングでoutput.txtに取得されます。

1
sdk

これを使用できます:

break>"%temp%\empty"&&fc "%temp%\empty" "%file_to_process%" /lb  X /t |more +4 | findstr /B /E /V "*****"

[〜#〜] x [〜#〜]を必要な行に置き換える必要があります。または、この名前をhead.bat

break>"%temp%\empty"&&fc "%temp%\empty" "%file_to_process%" /lb  %~1 /t |more +4 | findstr /B /E /V "*****"
0
npocmaka

単純なWindowsコマンドに固執したい場合はこれを使用できますが、大きなファイルでは少し遅くなります;-)(以下に2番目のソリューションを追加しました:-)これは任意の長さの最後の100レコードを抽出しますファイル)

find /n " " <test.txt >test.tmp
for /l %%i in (1,1,100) do find "[%%i]" <test.tmp >test.tmp2
for /f "delims=] tokens=2" %%i in (test.tmp2) do echo %%i >>test.new
del test.tmp
del test.tmp2
move /y test.new test.txt

find /v /n "" <test.txt >test.tmp
for /f "delims=: tokens=2 %%i in ('find /v /c "" test.txt') do set /a NR=%%i
set /a NS=%NR%-100
for /l %%i in (%NS%, 1, %NR%) do find "[%%i]" <test.tmp >>test.tmp2
for /f %%i "delims=] tokens=2 %%i in (test.tmp2) do echo %%i >>test.new
move /y test.new test.txt
0
Chris Clews