Ответ 1
paste -d '\n' file1 file2
Какой самый простой/быстрый способ чередования строк из двух (или более) текстовых файлов? Пример:
Файл 1:
line1.1
line1.2
line1.3
Файл 2:
line2.1
line2.2
line2.3
Interleaved:
line1.1
line2.1
line1.2
line2.2
line1.3
line2.3
Уверен, что легко написать небольшой Perl script, который открывает их обе и выполняет задачу. Но мне было интересно, возможно ли уйти с меньшим количеством кода, возможно, с одним слоем с использованием инструментов Unix?
paste -d '\n' file1 file2
Здесь решение с использованием awk
:
awk '{print; if(getline < "file2") print}' file1
производит этот вывод:
line 1 from file1
line 1 from file2
line 2 from file1
line 2 from file2
...etc
Использование awk
может быть полезно, если вы хотите добавить к выходу дополнительное форматирование, например, если вы хотите пометить каждую строку на основе того, из какого файла она поступает:
awk '{print "1: "$0; if(getline < "file2") print "2: "$0}' file1
производит этот вывод:
1: line 1 from file1
2: line 1 from file2
1: line 2 from file1
2: line 2 from file2
...etc
Примечание: этот код предполагает, что файл1 имеет длину больше или равную файлу2.
Если файл1 содержит больше строк, чем file2, и вы хотите выводить пустые строки для файла2 после его завершения, добавьте предложение else в тест getline:
awk '{print; if(getline < "file2") print; else print ""}' file1
или
awk '{print "1: "$0; if(getline < "file2") print "2: "$0; else print"2: "}' file1
Здесь можно сделать GUI: вставьте их в два столбца в электронную таблицу, скопируйте все ячейки, затем используйте регулярные выражения, чтобы заменить вкладки на новые строки.
@Послушайте ответ в полезном направлении. Вы можете добавлять номера строк, сортировать и разделять номера строк:
(cat -n file1 ; cat -n file2 ) | sort -n | cut -f2-
Примечание (меня интересует) для этого требуется немного больше работы, чтобы получить право на заказ, если вместо статических файлов вы используете вывод команд, которые могут работать медленнее или быстрее друг друга. В этом случае вам необходимо добавить/отсортировать/удалить другой тег в дополнение к номерам строк:
(cat -n <(command1...) | sed 's/^/1\t/' ; cat -n <(command2...) | sed 's/^/2\t/' ; cat -n <(command3) | sed 's/^/3\t/' ) \
| sort -n | cut -f2- | sort -n | cut -f2-
cat file1 file2 |sort -t. -k 2.1
Здесь указано, что разделитель "." и что мы сортируем по первому символу второго поля.