Как чередовать строки из двух текстовых файлов - PullRequest
73 голосов
/ 25 октября 2010

Какой самый простой / быстрый способ чередовать строки двух (или более) текстовых файлов?Пример:

Файл 1:

line1.1
line1.2
line1.3

Файл 2:

line2.1
line2.2
line2.3

Чередование:

line1.1
line2.1
line1.2
line2.2
line1.3
line2.3

Конечно, написать немногоСкрипт Perl, который открывает их оба и выполняет задачу.Но мне было интересно, можно ли обойтись меньшим количеством кода, может быть, одной строкой с использованием инструментов Unix?

Ответы [ 5 ]

132 голосов
/ 25 октября 2010
paste -d '\n' file1 file2
6 голосов
/ 09 мая 2015

Вот решение, использующее 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

Примечание: этот код предполагает, что file1 имеетбольше или равно длине файла 2.

Если файл1 содержит больше строк, чем файл2, и вы хотите вывести пустые строки для файла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
2 голосов
/ 18 октября 2016

@ Sujoy's answer баллов в полезном направлении. Вы можете добавлять номера строк, сортировать и вырезать номера строк:

(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-
1 голос
/ 07 февраля 2014

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

0 голосов
/ 25 октября 2010
cat file1 file2 |sort -t. -k 2.1

Здесь указано, что разделителем является "."и что мы сортируем по первому символу второго поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...