[shell][how-to] смешать два файла

state7401281

дано два файла, по N строк, в строках - например число.
нужно "смешать" эти два файла через строку.
т.е. {1,2,3} и {4,5,6} -> {1,4,2,5,3,6}?

sergey_m

ненавижу shell


#!/usr/local/bin/perl -wT
use strict;
local (*F1, *F2);
my ($f1, $f2);
open(F1, "<", "/etc/passwd") or die;
open(F2, "<", "/etc/group") or die;
while ($f1 = <F1>, $f2 = <F2> ) {
print("$f1$f2");
}

a10063

если файлы маленькие, то можно вывести их в массивы строк f1, f2
а потом вывести соответствующим образом в файл (в цикле)
на перле выглядит проще

state7401281

> ненавижу shell
глеб, я не спрашивал твоего мнения о shell'е.
ps: perl не подходит

sergey_m

[PL/SQL][how-to] хочу написать 3D-шутер. Другие языки не предлагать.

zontik

маза сделать через


cat file1 | head $i | tail 1 >> newfile
cat file2 | head $i | tail 1 >> newfile


и все в цикл for по $i от 1 до `wc file1`

state7401281

> [PL/SQL][how-to] хочу написать 3D-шутер. Другие языки не предлагать.
если ты серьезно - вперед. если нет - зачем ебать мозг?

Marinavo_0507

когда говорят shell, обычно подразумевают, что доступны стандартные утилиты
многие считают, что perl относится к таким

sergey_m



cat file1 | head $i | tail 1 >> newfile
cat file2 | head $i | tail 1 >> newfile
и все в цикл for по $i от 1 до `wc file1`


О! Как это напоминает мне увлекательный процесс сшивания франкенштейна. 3 exec на каждую строчку, всасывание файла столько раз, сколько в нем строчек. Прогон через пайпы объема данных превышающего объем файла на порядки.Франкенштейн как правило потом медленно ходит и часто спотыкается, зато большой и устрашающий.
P.S. Сегодня ходил на Ван-Хельсинга. Там очень милый Франкенштейн.

Promise123


nl -i 2 -v 1 -s '::'F1 >_F nl -i 2 -v 2 -s '::'F2 >>_F sort _F |sed 's/^[^:]*:://'>__F

dus1970

то есть:

nl -i2 -v1 -s'::' F1 >_F
nl -i2 -v2 -s'::' F2 >>_F
sort _F | sed 's/^[^:]*:://' >__F

sergey_m

Твой франкенштейн поменьше и будет работать существенно быстрее, чем приведенная ранее альтернатива. Поздравляю. Однако на действительно больших файлах sort выжрет очень много памяти. Кроме того, на действительно больших файлах тебе потребуется много свободного места на файловой системе. Ну и конечно тебе нужна rw файловая система. А perlовое решение обходится без неё. Следующим важным моментом будет защита скрипта от самого себя, в смысле от парраллельного запуска. __F нужно заменить на $(mktemp bla-bla-bla а ведь это сразу в голову не пришло, не так ли? Таких вот моментов в шелльном программировании масса.
P.S. Одно из важных свойств шелльного программирования - увлекательность. Можно придумать несколько разных франкенштейнов и обсуждать их преимущества друг перед другом. Программирование на perlе таких задач намного более прямолинейно и скучно. Приведенное мною решение приходит в голову за 5 секунд, и является оптимальным. Дальше работа спинного мозга - настучать на клаве текст. Альтернативные решения будут извратами. Кроме того, моя программа легко читается, чего не скажешь о шелльных франкенштейнах. Её нельзя назвать красивой - она проста как валенок. Франкенштейны же всегда содержат какой-то хитрый прием, делаюший честь их создателю и тешущий его самолюбие.
P.P.S. Не злитесь на меня. Месяц назад я два дня работал над оптимизацией длинного шелльного скрипта написанного моим сотрудником. Я сделал его быстрее в 3-4 раза и завернул там еще несколько красивых приемов. Я получал от этого удовольствие. Шелл дает возможность получать удовольствие от решения тривиальных задач.

evgen5555

Приведенное мною решение приходит в голову за 5 секунд, и является оптимальным.
Исус Христос?

sergey_m

Оно любому человеку приходит в голову за 5 секунд. Насчет оптимальности - вперед, оспаривай. Приводи другие примеры.

state7401281

глеб, не зачем так сильно переживать. я ценю предоставленое тобой решение на перле и уважаю твое мнение. но если тебя так сильно анноит существование шелла - не пользуйся им, когда все поступят как ты - он вымрет. выражая же свое негодование публично - ты только лишь привлекаешь внимание к объекту.

tarasish

\\Там очень милый Франкенштейн
[offtopic]
типа чиста для справки- франкенштейн- это профессор, который создал монстра. сам монстр не франкенштейн, а "чудовище фрнакенштейна"
[/offtopic]

Casha07

да, точно проф. д.ф.-м.н. Виктор Франкенштейн

vall

while read -u 3 a ; read -u 4 b ; do echo $a; echo $b ; done 3<file1 4<file2

ma3yp

Да, прав Глеб по поводу увлекательности шельного программирования...

sergey_m

while read -u 3 a ; read -u 4 b ; do echo $a; echo $b ; done 3<file1 4<file2
Извините, это не шелл, это bash. Встроенная команда read в sh описана тут. Поэтому этот франкенштейн не допускается к соревнованиям. Пока лидирует решение через nm + sort.

vall

while read a <&3 ; read b <&4; do echo $a; echo $b ; done 3<file1 4<file2

sergey_m

Супер! Учитывая, что echo встроенная команда, данный метод может соревноваться с перлом. Однозначно победитель!

Marinavo_0507

Видишь, шелл рулит, и ничего с этим не поделать
Оставить комментарий
Имя или ник:
Комментарий: