Как читать одновременно из двух файлов и печатать их по строкам, bash?

Я хочу написать скрипт, который имеет в качестве аргументов два файла F1 и F2 и печатает их в качестве альтернативы; сначала будет записана первая строка F1, затем вторая строка F2'2 и так далее. Если у одного из них меньше строк, чем у другого, когда мы заканчиваем печатать более короткий, сценарий должен писать дольше всего до конца.

Моя идея:

1) Проверьте, нет ли 2 аргумента -> эхо и выход 2) Проверьте, не F1 или F2 не файлы -> эхо и выход 3) Тело:

exec 3 < $1 exec 4 < $2 i=0 j=1 while read -u 3 line && ((i==0)) do echo line; echo ((i++)) ((j--)) while read -u 4 line && ((j==0)) do echo line; echo ((j++)) ((i--)) done done exit $? 

Сомнение: Это будет работать, только если оба файла имеют одинаковое количество строк. Как я могу улучшить это, чтобы расширить это решение до файлов разного размера?

Нет необходимости в скрипте оболочки. Вы можете сделать это напрямую с помощью paste , которая указана в POSIX :

 paste -d '\n' file1 file2 

Однако он не обрабатывает разные строки, как вы описываете. Процитировать спецификации:

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

Я лично считаю, что было бы ошибкой делать поведение, как вы описываете в своем вопросе. Вы не сможете сказать, глядя на строку 24 вывода, независимо от того, поступали ли они из file1 или file2 . С фактическим поведением paste вы бы знали, что это произошло из file2 , поскольку это четный номер строки.

Вы можете вывести вывод через tr -s '\n' следующим образом:

 paste -d '\n' file1 file2 | tr -s '\n' 

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