Как объединить первые N слов нескольких файлов TMP с помощью CMD - PullRequest
0 голосов
/ 19 сентября 2018

Как объединить первые N слов нескольких файлов tmp, используя cmd.Я попытался объединить первую строку, но когда я проверяю текстовый файл, он показывает 4 строки для каждой 1 строки в файлах tmp

ПРИМЕР:

TMP ФАЙЛ 1: ИМЯ ФАЙЛА: GALILEO1 CONTENT:

SAMPLE WORDS TO GET THE FIRST EIGHT WORD1 FOR EACH FILE
SAMPLE WORDS TO GET THE FIRST EIGHT WORDS FOR EACH FILE
SAMPLE WORDS TO GET THE FIRST EIGHT WORDS FOR EACH FILE

TMP ФАЙЛ 2: ИМЯ ФАЙЛА: GALILEO2 СОДЕРЖАНИЕ:

SAMPLE WORDS TO GET THE FIRST EIGHT WORD2 FOR EACH FILE
SAMPLE WORDS TO GET THE FIRST EIGHT WORDS FOR EACH FILE
SAMPLE WORDS TO GET THE FIRST EIGHT WORDS FOR EACH FILE

ЖЕЛАЕМЫЙ ВЫХОД В TXT:

GALILEO1.TMP SAMPLE WORDS TO GET THE FIRST EIGHT WORD1
GALILEO2.TMP SAMPLE WORDS TO GET THE FIRST EIGHT WORD2

Файлы tmp содержат несколько слов водна строка, но когда я извлек ее, используя приведенный ниже код, текстовый файл показывает его в виде 4 строк.

@echo off
setlocal EnableDelayedExpansion
if exist galileo.txt del galileo.txt
for %%f in (*.tmp) do (
    set i=0
    for /F "delims=" %%l in (%%f) do (
        set /A i+=1
        set line!i!=%%l
    )

    echo %%f, Galileo !line1! >> galileo.txt
)

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Если файлы не большие, в скрипте файла .bat можно использовать следующий скрипт PowerShell.Это будет вплетать первые восемь (8) слов каждой строки в новый файл.

Да.Я знаю, что вы не просили решение PowerShell.Это еще один вариант в любой современной системе Windows.

powershell -NoProfile -Command ^
    "$output_file = '.\galileo.txt';" ^
    "" ^
    "$f1 = Get-Content -Path '.\galileo1.txt';" ^
    "$f2 = Get-Content -Path '.\galileo2.txt';" ^
    "" ^
    "if (Test-Path -Path $output_file) { Remove-Item -Path $output_file };" ^
    "" ^
    "$maxline = [Math]::max($f1.Length, $f2.Length);" ^
    "" ^
    "for ($i=0; $i -lt 5; $i++) {" ^
    "    if ($f1[$i]) {" ^
    "        $a = $f1[$i].Split();" ^
    "        $s = $a[0..7] -join ' ';" ^
    "        Out-File -InputObject $s -FilePath $output_file -Append -Encoding ascii" ^
    "    };" ^
    "    if ($f2[$i]) {" ^
    "        $a = $f2[$i].Split();" ^
    "        $s = $a[0..7] -join ' ';" ^
    "        Out-File -InputObject $s -FilePath $output_file -Append -Encoding ascii" ^
    "    };" ^
    "}" ^

Если вы поместите этот код в файл (например, merge.ps1), он может быть вызван из сценария файла .bat с помощью:

powershell -NoProfile -File .\merge.ps1

Это будет содержимое файла merge.ps1.

$output_file = '.\galileo.txt'

$f1 = Get-Content -Path .\galileo1.txt
$f2 = Get-Content -Path .\galileo2.txt

if (Test-Path -Path $output_file) { Remove-Item -Path $output_file }

$maxline = [Math]::max($f1.Length, $f2.Length)

for ($i=0; $i -lt 5; $i++) {
    if ($f1[$i]) {
        $a = $f1[$i].Split()
        $s = $a[0..7] -join ' '
        Out-File -InputObject $s -FilePath $output_file -Append -Encoding ascii
    }
    if ($f2[$i]) {
        $a = $f2[$i].Split()
        $s = $a[0..7] -join ' '
        Out-File -InputObject $s -FilePath $output_file -Append -Encoding ascii
    }
}
0 голосов
/ 20 сентября 2018

Исходя из первых N слов в строке первая , но не в целом:

  • Считайте первую строку с помощью Set /p и перенаправьте в переменную
  • используйте for /f для анализа первых 8 слов (разделенных пробелами / табуляцией).

:: Q:\Test\2018\09\20\SO_52396744.cmd
@echo off
setlocal EnableDelayedExpansion
if exist galileo.txt del galileo.txt
set i=0
( for %%f in (*.tmp) do (
      set /A i+=1
      Set /P "line="<%%f
      for /F "tokens=1-8" %%A in ('echo:!line!') do (
        echo Galileo!i!.TMP %%A %%B %%C %%D %%E %%F %%G %%H
      )
  )
) > galileo.txt

пример вывода:

> type galileo.txt
Galileo1.TMP SAMPLE WORDS TO GET THE FIRST EIGHT WORD1
Galileo2.TMP SAMPLE WORDS TO GET THE FIRST EIGHT WORD2
...