Объединить альтернативные строки из двух файлов


9

File1:

.tid.setnr := 1123 
.tid.setnr := 3345 
.tid.setnr := 5431
.tid.setnr := 89323

File2:

.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60

Выходной файл:

.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

2
Пожалуйста, всегда упоминайте свою операционную систему. Многие стандартные инструменты ведут себя по-разному в разных ОС, поэтому нам нужно знать, что вы используете.
Terdon

Ответы:




5

pasteРешение является самым портативным и самым эффективным. Я упоминаю эту альтернативу только в том случае, если вы предпочитаете ее поведение в случае, когда два файла не имеют одинаковое количество строк:

С GNU sed:

sed Rfile1 file2

Если file1имеет меньше строк, чем file2, то, когда file1исчерпан, sedничего не будет выводить для него (в отличие от пустых строк для paste).

Если file1имеет больше строк, чем file2, то эти дополнительные строки будут отброшены (в отличие от печати пустых строк для file2с помощью paste).

$ paste a b
1       a
2       b
3
4
$ paste -d \\n a b
1
a
2
b
3

4

$ sed Rb a
1
a
2
b
3
4
$ sed Ra b
a
1
b
2

4

Используя awk( gawk, nawk, mawk):

awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 > outputfile
  • NR==FNR {x[FNR]=$0;next}: NR==FNRсопоставляется, только если текущий номер записи равен текущему номеру записи файла (следовательно, он сопоставляется только при обработке первого файла): сохраняет xтекущую обработанную запись в массиве с индексом, равным номеру текущей записи файла, и пропускает текущая запись
  • {print x[FNR]"\n"$0}: печатает содержимое массива xс индексом, равным номеру текущей записи файла, за которым следует новая строка и содержимое текущей записи
~/tmp$ cat file1
.tid.setnr := 1123
.tid.setnr := 3345
.tid.setnr := 5431
.tid.setnr := 89323
~/tmp$ cat file2
.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60
~/tmp$ awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1
.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

Это дает вывод, но не совсем то, что я хотел. Строки tid.info идут после строк tid.setnr в моем выходном файле.
pmaipmui

@Nainita Это то, что вы показываете в своем примере вывода.
Кос

@Nainita В любом случае для переключения порядка вывода можно просто переключиться file1и file2в команде.
Кос

Да ... Я сделал то же самое, но он печатал точно так же, как и раньше. после распечатки tid.setnr потом печатал tid.info.
pmaipmui

1
@mikeserv Однако, так как я был в этом, я попробовал mawkтакже, и это бежит на этом также. В любом случае, будучи разумным, я не понимаю, почему это не должно работать только наоборот (то есть просто путем переключения файлов). Это не то, что awkзаботится о вводе, строки - это строки. Если бы что-то не было поддержано его версией, это просто сломалось бы в первый раз. Проще говоря, просто OP сделал ошибку, переключив входные файлы в аргументах.
Кос

-1

Самое простое решение приведено ниже.

cat file1 >> file2

или

cat file2 >> file1

1
sachin, прочти вопрос еще раз; это добавляет содержимое одного файла к содержимому другого файла. Он не объединяет файлы, чередующиеся по строкам (поэтому одна строка file1затем одна строка из file2и так далее ...)
don_crissti
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.