Как добавить новые строки из другого файла с помощью sed

Как добавить новые строки из другого файла с помощью sed

Я пытаюсь найти sedкоманду, которую я могу вставить filenameв filename1. Это мои два отдельных файла.

ВХОД filenameимеет:

Cindy   11 22 54
Chester 48 12 84

ВХОД filename1имеет:

 Name  Class1 Class2 Class3
Lee      92     94     88
Chancy   91     85     95
Dora     99     77     96


Jefferry 84     98     90

Вот результат, который мне нужен (выход):

Name   Class1 Class2 Class3
Lee      92     94     88
Chancy   91     85     95
Dora     99     77     96
Cindy    11     22     54
Chester  48     12     84
Jefferry 84     98     90

Если мне нужно что-то прояснить, дайте мне знать. По сути, Синди и Честер должны быть прямо между Дорой и Джефферри.

решение1

Чтобы добавить все строки из filenameв filename1с помощью sedкоманды, можно сделать следующее:

sed r filename1 filename

Однако обратите внимание, что результат будет немного отличаться от результата, указанного в вашем вопросе, а именно:

Name  Class1 Class2 Class3
Lee      92     94     88
Chancy   91     85     95
Dora     99     77     96
Jefferry 84     98     90
Cindy    11     22     54
Chester  48     12     84

Редактировать

Дополнительная sedинформация, полезная для этого вопроса:

  • Добавить filenameпосле 4-й строки filename1:

    sed '4 r filename' filename1

  • Добавить filenameпосле строки, которая начинается с «Дора» в filename1:

    sed '/^Dora/ r filename' filename1

  • Чтобы добавить filenameпосле 4-й строки и удалить все пустые строки filename1:

    sed '/^$/d;4 r filename' filename1

решение2

Если я правильно помню, никакого порядка быть не должно.

В таком случае:

$ cat file2 file1 | column -t
Name      Class1  Class2  Class3
Lee       92      94      88
Chancy    91      85      95
Dora      99      77      96
Jefferry  84      98      90
Cindy     11      22      54
Chester   48      12      84

решение3

Если вы это сделаете:

sed r file1 file2

...тогда sedпопытается и не сможет добавить rфайл ead с именем файла нулевой длины к каждой входной строке обоих именованных входных файловfile1иfile2. Эта команда по сути ничем не отличается от:

sed '' file1 file2

...за исключением того, что rон медленнее.

Это то, что я имею в виду:

seq 1  5 > file1
seq 6 10 > file2
strace sed r file[12]

...
write("1\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("2\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("3\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("4\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("5\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
read(3, "", 4096) = 0
close(3) = 0
open("file2", RDONLY) = 3
write("6\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("7\n", 21) = 2
...

Увидеть open("" ...)неудачу сENOENTпосле каждой выписанной строки? Это пустая rкоманда ead sedзапускается. Вы не замечаете сбоев, потому что sedспецифицировано, чтобы не жаловаться на несуществующий rфайл ead, указанный в его скрипте, а скорее продолжать работать так, как будто ничего не произошло, когда он пытается rпрочитать его.

И может быть этовыглядиткак будто это работает, потому что вы просто хотите добавить файл в конец другого - чтобы объединить catдва файла - что sedпроисходит по умолчанию, когда два входных файла названы - он читает первый, а затем следующий. Но если бы rкоманда ead действительно работала, то названный rфайл ead был бы добавлен полностью ккаждыйлинейный вход.

Так:

seq 3 > file
printf %s\\n a b c | 
sed r\ file

a
1
2
3
b
1
2
3
c
1
2
3

Чтобы добавить содержимое одного файла в другой, вы можете сделать следующее:

cat < file2 >> file1

Чтобы добавить данные только после определенной точки ввода, у вас есть несколько вариантов. sedСреди них:

sed -e '/match/{r file2' -e:n -e 'n;bn' -e \} file1

...который должен работать практически с любым sed.

Или, если у вас POSIX sed:

{ sed /match/q; cat file2 -; } < file1

...что должно быть гораздо эффективнее.

Оба метода гарантируют, что содержимоеfile2читается только rодин раз и только сразу после первого появления matchсловаfile1.

Другой способ может выглядеть так:

cat file2 | sed /match/r\ /dev/fd/0 file1

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

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