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

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

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

Моя идея была такой:

1) Проверьте, нет ли 2 аргументов -> echo и выйдите 2) Проверьте, не являются ли F1 или F2 файлами -> echo и выйдите 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 $?

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

решение1

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

paste -d '\n' file1 file2

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

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

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

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

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

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

Связанный контент