Intereting Posts
Как настроить PulseAudio для 7.1 Surround Sound через HDMI? Как настроить общесистемный прокси socks 5 на сервере Ubuntu 16.04? ssh изменить пользователя и выполнить команду Разрешение каталога Setuid подразумевает разрешение на выполнение? Как установить лабораторию обработки изображений Aforge на Linux с помощью Wine Почему scp настолько медленный и как сделать это быстрее? Настроить ошибку «Компилятор C не может создавать исполняемые файлы» Debian jessie, primus и 32-разрядные приложения Почему sudo медленно, когда я ошибаюсь в моем пароле? Lxpanel иногда зависает Создайте отдельные архивы 7z для каждого каталога в текущем каталоге и дополнительно распараллелите через GNU Parallel Как использовать wget или другой инструмент для загрузки файла, для которого ссылка скрыта (активируется только при щелчке) Сохранение SSH-туннеля во время моей системы – init.d или что-то еще? Ошибка Rsnapshot через SSH Как связать wlan и tun

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

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

filename INPUT имеет:

 Cindy 11 22 54 Chester 48 12 84 

INPUT 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 

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

Чтобы добавить все строки из 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

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

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

 $ 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 попытается и не сможет добавить файл с нулевым именем файла в каждую строку ввода как с указанными входными файлами file1 и с file2 . Эта команда по существу не отличается от:

 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 после каждой строки, выписанной? Это означает, что команда sed запускает пустую команду. Вы не замечаете сбоев, потому что sed не жаловался на несуществующий файл, названный в его скрипте, а продолжал, как будто ничего не произошло, когда он пытался его использовать.

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

Как это:

 seq 3 > file printf %s\\nabc | 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 будет только один раз и только сразу после первого match в file1 .

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

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

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