LINUX.ORG.RU

merge files line by line


0

0

Не знаю наверное это не совсем сюда? Но скорее здесь Вы будете быстрее знать.

Какой наиболее элегантный способ из баша скажем читать два списка одновременно линия по линии? Что-то в ключе:

for [i,j] in [`find /a`,`find /b`]; do
cat $i > $j
done

например.. Как наиболее элегантно сделать первую строку?

{ find /a; >&-; find /b; >&-; } | paste - - \
    | while read L R; do
          cat $L > $R
      done

но эта фича с paste - - не везде будет работать..
придется временный файл делать чтобы портабельно

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Почему - "нетбсдшный"?

$ dpkg -S `which paste` coreutils: /usr/bin/paste

Так что на онтопичных системах оно тоже есть.

anonymous
()
Ответ на: комментарий от dilmah

Эээ, сорри, ступил. Такого линуксовый paste, наверное, не умеет.

Думается мне, что портабельнее воспользоваться башизмом типа

paste <(find /a) <(find /b) | while read X Y; do cat $X > $Y; done

anonymous
()
Ответ на: комментарий от dilmah

> я имею в виду умеет ли он делать paste - -

Если так написать, он (paste из coreutils) на каждый "-" последовательно читает строку из потока, то есть работает как "xargs -n 2".

Про фокус с ">&-" расскажи. :) Не понял, как stdout делится.

amm ★★
()
Ответ на: комментарий от amm

> Про фокус с ">&-" расскажи. :) Не понял, как stdout делится.

по ходу, я тут прогнал:)

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

В принципе такое поведение плохо: потому что утилите тогда нужно сохранять весь первый файл.

То есть правильное решение -- это создавать второй пайп: либо явно mkfifo, либо вот как выше с помощью нестандартного расширения шелла.

dilmah ★★★★★
()

Странно наблюдать за извращенными попытками сделать все без временных файлов (при наличии tmpfs накладные расходы минимальны), получая при этом неустойчивые и непереносимые решения.

З.Ы. Кстати, с использованием "paste" и "read a b", как насчет строк с пробелами?

sdio ★★★★★
()
Ответ на: комментарий от dilmah

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

amm ★★
()
Ответ на: комментарий от sdio

> Странно наблюдать за извращенными попытками сделать все без временных файлов (при наличии tmpfs накладные расходы минимальны), получая при этом неустойчивые и непереносимые решения.

Подобные задачи надо стараться другими средствами решать. А если уж извращаться, то по полной.

> З.Ы. Кстати, с использованием "paste" и "read a b", как насчет строк с пробелами?

Как обычно. :)

amm ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.