Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Чтение из двух файлов с выводом в один

Ответить
Настройки темы
CMD/BAT - [решено] Чтение из двух файлов с выводом в один

Пользователь


Сообщения: 94
Благодарности: 10

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: txt 123.txt
(829 байт, 7 просмотров)
Тип файла: txt 456.txt
(831 байт, 7 просмотров)
Добрый день!

Подскажите, пожалуйста, как реализовать такую задачу. Есть два файла 123.txt и 456.txt (см. вложение) с числом на каждой строчке, а нужно получить файл 789.txt с таким содержанием:

Код: Выделить весь код
Первое число из 123.txt#Первое число из 456.txt
Второе число из 123.txt#Второе число из 456.txt
Третье число из 123.txt#Третье число из 456.txt
...
Что соответствует:

Код: Выделить весь код
1#3
5#7
9#10
...
Возможно ли такое? Я возился с циклами for /l и с командой more, использовал счётчики строк, но так ничего толкового и не добился... А more вообще почему-то не работает на Windows 8 (выдаёт сообщение, что "слишком много аргументов для командной строки" даже при выполнении простой задачи):

Код: Выделить весь код
for /f "delims=" %%a in ('more +10 ^<"123.txt"') do echo %%a

Отправлено: 10:39, 06-08-2013

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


для небольших по размеру файлов и до 9999 строк:
Код: Выделить весь код
@echo off
(
for /f "tokens=1,2 delims=[] " %%a in ('^<123.txt find /n /v ""') do (
  set "$a=000%%a"
  call set "$%%$a:~-4%%=%%b"
)
for /f "tokens=1,2 delims=[] " %%a in ('^<456.txt find /n /v ""') do (
  set "$a=000%%a"
  call call echo %%%%$%%$a:~-4%%%%%%#%%b
))>789.txt

Последний раз редактировалось amel27, 06-08-2013 в 11:53.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:48, 06-08-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 94
Благодарности: 10

Профиль | Отправить PM | Цитировать


amel27, спасибо Вам огромное! Хм... call call :D Очень интересная конструкция) А можете, если Вас не затруднит, объяснить принцип работы скрипта?

Отправлено: 13:08, 06-08-2013 | #3


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


После интереснейшего решения amel27 размещаю своё, так как просто жаль выбрасывать бесследно в корзину
Код: Выделить весь код
@Echo Off

SetLocal EnableExtensions EnableDelayedExpansion

Set "Skip="
Set /A N=0

Del 789.txt 2>Nul

FOR /F "%Skip% usebackq delims=" %%i IN (123.txt) DO (
	Call :Continue %%i !Skip!
	Set /A N=!N!+1
	Set "Skip=skip=!N!"
)
GoTo :Eof

:Continue
	FOR /F "%Skip% usebackq delims=" %%j IN (456.txt) DO (
		>>789.txt Echo %1#%%j 
		GoTo :Eof	     
	)

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:09, 06-08-2013 | #4


Пользователь


Сообщения: 94
Благодарности: 10

Профиль | Отправить PM | Цитировать


megaloman, и Вам спасибо большое! Ваш вариант мне ближе и доступней

Отправлено: 14:47, 06-08-2013 | #5


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Bruce Wayne:
А можете, если Вас не затруднит, объяснить принцип работы скрипта? »
в общих чертах:
первый FOR считывает содержимое 1-го файла в массив переменных (префикс имени $):
Код: Выделить весь код
for /f "tokens=1,2 delims=[] " %%a in ('^<123.txt find /n /v ""') do (
  set "$a=000%%a"
  call set "$%%$a:~-4%%=%%b"
)

SET $
можно обойтись и без FIND - обычным счетчиком строк в переменной,
второй FOR построчно читает 2-й файл, добавляет в начало значение переменной массива (выборка из массива по номеру строки) и выводит результат

Цитата Bruce Wayne:
call call :D Очень интересная конструкция)
Код: Выделить весь код
@echo off

set "$1=++"
set "$2=$1"
set "$3=$2"

set $
pause

echo %$3%
echo %%%$3%%%
call echo %%%$3%%%
call echo %%%%%%%$3%%%%%%%
call call echo %%%%%%%$3%%%%%%%

pause
результат:
Код: Выделить весь код
$1=++
$2=$1
$3=$2
Для продолжения нажмите любую клавишу . . . 
$2
%$2%
$1
%$1%
++
Для продолжения нажмите любую клавишу . . .
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:43, 06-08-2013 | #6


Пользователь


Сообщения: 148
Благодарности: 39

Профиль | Сайт | Отправить PM | Цитировать


amel27, приветствую.
Можно поинтересоваться, в чем замысел 4-значного формата индекса?
Возможность вывести в последовательном порядке через set $ ? В самом коде по сути можно без этого?

megaloman, синхронное чтение - супер !

И вариант от меня:

Код: Выделить весь код
@echo off
Setlocal EnableExtensions
set src1=123.txt
set src2=456.txt
set dest=789.txt

for /f %%? in ('find /c /v "" ^< "%src1%"') do set lines=%%?

< "%src1%" (
  for /l %%? in (1 1 %lines%) do set /p "$1.%%?="
)
< "%src2%" > "%dest%" (
  for /l %%? in (1 1 %lines%) do set /p "$2.%%?="& call echo %%$1.%%?%%#%%$2.%%?%%
)

-------
Alex Dragokas

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:45, 07-08-2013 | #7


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Diskretor:
Можно поинтересоваться, в чем замысел 4-значного формата индекса?
Возможность вывести в последовательном порядке через set $ ?»
всё гораздо проще
первый вариант читал в массив оба файла - в этом случае без сортировки не обойтись

Отправлено: 05:21, 07-08-2013 | #8


Пользователь


Сообщения: 148
Благодарности: 39

Профиль | Сайт | Отправить PM | Цитировать


ORLY ?

Код: Выделить весь код
@echo off
SetLocal EnableExtensions
(
  for /L %%? in (1,1,9999) do echo %%?
) > 123.txt
copy /y 123.txt 456.txt

for /f "tokens=1* delims=[]" %%a in ('^<123.txt find /n /v ""') do set "$%%a=%%b"
(
for /f "tokens=1* delims=[]" %%a in ('^<456.txt find /n /v ""') do call echo/%%$%%a%%#%%b
)>789.txt

-------
Alex Dragokas


Отправлено: 02:03, 08-08-2013 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Чтение из двух файлов с выводом в один

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Помогите выбрать один телефон из двух VALERIAM Мобильные ОС, смартфоны и планшеты 4 04-04-2013 23:10
компьютер включается один раз из двух Shiroky Непонятные проблемы с Железом 12 27-07-2009 23:21
БП и ИБП - Помогите выбрать БП, один из двух Thermaltake. amzir Прочее железо 1 10-04-2008 22:28
Не работает один привод из двух Angel_19 Microsoft Windows Vista 7 06-03-2007 16:03
Из двух винтов собрать один Knight Deadly Накопители (SSD, HDD, USB Flash) 11 31-12-2005 08:41




 
Переход