
Я хочу написать скрипт, который имеет в качестве аргументов два файла 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'
Но, если естьдействительныйпустых строк в любом из файлов, вы не получите ожидаемых результатов.