Чтобы добавить все линии из имя файла
- 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 '/ ^ ^ ^ r / r Имя файла файла1
, чтобы добавить filename
после 4-й строки и удалить любые пустые строки из Filename1
:
SED '/ ^ $ / D; 4 r Filename' filename1
не должно быть никакого заказа, если я правильно запомню.
В этом случае:
$ 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
Если вы сделаете:
sed r file1 file2
... тогда sed
попытается и не сможет добавить файл ead r
с именем файла нулевой длины в каждую строку ввода обоих его именованные входные файлы файл1
и файл2
. Эта команда по сути ничем не отличается от:
sed '' file1 file2
... за исключением того, что w / 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
отозвать.
И, возможно, это выглядит так, как будто это работает, потому что вы просто хотите добавить файл в конец другого - чтобы con cat
enate два файла, что 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
... который считывал бы файл нулевой длины после каждого совпадения, следующего за первым ...