URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10147
[ Назад ]

Исходное сообщение
"Скрипт для совмещения строк"

Отправлено Uche , 11-Фев-17 01:07 
Доброго времени.
Имею некое отношение к составлению различных заданий для учащихся. В познавательных для себя целях решил использовать баш как основу для автоматизации некоторых процессов. Вот в чем суть, если абстрагировано. Имеется некий файл А в котором содержатся имена. Имеется некий файл Б, в котором имеются фамилии. Задача в том, чтобы создать из этих двух файлов файл В, где каждая из строк файла А совмещалась с каждой строкой файла Б, т.е. в файле В каждое имя было совмещено с каждой фамилией. Например
Файл А:
1
2
3

Файл Б:
а
б
в

Файл В (результат совмещения):









Сейчас на таком застрял на этом:
echo > C
STR1=`wc -l a`
NUM=0
S1=`cat A|head -$NUM`
S2=`cat B|head -$NUM`
until [ $NUM -lt $STR1 ]
do
let NUM=$NUM+1
echo "$S1$S2" >> C
done

И тут моих знаний пока не хватает, чтобы понять, как вместо построчного совмещения, получить строки каждая+каждая. Может кто подсказать?



Содержание

Сообщения в этом обсуждении
"Скрипт для совмещения строк"
Отправлено михалыч , 11-Фев-17 04:43 
а вам точно на баше нужно?
#!/bin/sh

while read name; do
    while read surname; do
        echo $name$surname;
    done < surname
done < name
exit


а то использование всяких там wc cat head могут приравнять к читерству )))

"Скрипт для совмещения строк"
Отправлено Square1 , 11-Фев-17 14:09 

>[оверквотинг удален]
> STR1=`wc -l a`
> NUM=0
> S1=`cat A|head -$NUM`
> S2=`cat B|head -$NUM`
> until [ $NUM -lt $STR1 ]
> do
> let NUM=$NUM+1
> echo "$S1$S2" >> C
> done
>

Ваше решение..хм.. скажем так- не лишено остроумия и оригинальности... но выдает с потрохами что вы никогда прежде программированием ничего сложнее бэйсика начальных классов не занимались...

если вам не нужна поточная обработка больших объемов данных (файлы не гигабайтные)
то можно считать второй файл построчно в массив, и выводить его в цикле, конкатенируя строки.


"Скрипт для совмещения строк"
Отправлено Led , 11-Фев-17 17:55 
man join


"Скрипт для совмещения строк"
Отправлено . , 11-Фев-17 22:52 
> man join

Led, а ты сам то ... :)  
Возникает классический вопрос джентльмена на рыбалке :) "НО КАК!? сэр ...Э :-)))
Объясняй.


"Скрипт для совмещения строк"
Отправлено Led , 12-Фев-17 02:09 
>> man join
> Led, а ты сам то ... :)
> Возникает классический вопрос джентльмена на рыбалке :) "НО КАК!? сэр ...Э :-)))
> Объясняй.

Да никак. Не вчитывался в условие:)

В данном случае, пожалуй, while/do + sed будет достаточно.


"Скрипт для совмещения строк"
Отправлено DeadLoco , 13-Фев-17 15:44 
> Возникает классический вопрос джентльмена на рыбалке :) "НО КАК!? сэр ...Э :-)))
> Объясняй.

join(1) имеет рестрикт по равенству первых полей, и не является декартовым произведением


"Скрипт для совмещения строк"
Отправлено Andrey Mitrofanov , 12-Фев-17 06:19 
> Задача в том, чтобы создать из этих двух файлов файл В,
> где каждая из строк файла А совмещалась с каждой строкой файла
> Б, т.е. в файле В каждое имя было совмещено с каждой
> совмещения, получить строки каждая+каждая. Может кто подсказать?

$ parallel echo {1}{2} :::: file-123 file-abc

-- https://www.gnu.org/s/parallel/ Всего 300К на perl-е творят чудеса.

$ parallel echo {1}{2} ::: {1..3} ::: {a..c}
$ parallel echo {1}{2} ::: 1 2 3 ::: a b c