Как я могу скопировать содержимое текстового файла и вставить его в другой, начиная с определенной строки?

12

Мне нужно скопировать содержимое текстового файла и вставить его в другой текстовый файл. Первый текстовый файл содержит 10 строк данных, и мне нужно, чтобы они были скопированы во второй текстовый файл, начиная со строки № 5 (например). Таким образом, во втором текстовом файле эти данные должны быть записаны из строки 5 в строку 14. Как это можно сделать? Заранее спасибо. Считайте меня новичком в отношении Linux.

Г. Пасхалис
источник

Ответы:

9

headи tailрешение

Предположим, что исходный файл вызван, ~/aи файл для вставки вызван ~/b. Мы поместим объединенный файл в ~/c:

head -n 5 ~/a > ~/c
cat ~/b >> ~/c
tail --lines=+6 ~/a >> ~/c
  • Путь ~/краткий для вашего /home/userимени каталога
  • head копирует первые пять строк файла aво вновь созданный файлc
  • cat выводит содержимое файла bи добавляет его в файлc
  • хвост добавляет файл, aначиная со строки 6 до конца файлаc

После проверки переименуйте объединенный файл

После проверки , что файл cправильно сливались из файлов aи bмы переименуем cв aиспользовании:

mv ~/c ~/a
  • mvперемещает файл cв файл a. Данные не перемещаются физически. Файл просто переименовывается, что экономит время.
WinEunuuchs2Unix
источник
Спасибо за ваш ответ. Работало просто отлично. Однако есть ли другой способ сделать это без использования третьего текстового файла?
Г. Пасхалис
Третий файл может быть переименован в исходный файл, когда закончите. Я подумал, что лучше всего сначала посмотреть файл. Я добавлю дополнительные шаги к ответу сейчас.
WinEunuuchs2Unix
Или ...(head -n 5 a.txt ; cat b.txt ; tail -n +6 a.txt) > c.txt
1
@JJoao Это хорошая однострочная сводка :) В учебных целях я предпочитаю использовать одну строку для командного метода и вложенные операторы if. Однако для копирования и вставки в терминал я люблю один лайнер!
WinEunuuchs2Unix
16

Самый простой инструмент здесь может быть sed. Для того, чтобы вставить b.txtв a.txtпосле 5 - й линии, вы могли бы написать:

sed '5r b.txt' a.txt

sedчитает файл, указанный как аргумент ( a.txt), построчно. Все строки воспроизводятся в выходных данных так же, как они появлялись во входных данных, если только они не изменены командой.

5Это адрес (номер строки) , при которой следующая команда должна быть выполнена. Команда, которую мы используем r, принимает имя файла в качестве аргумента (здесь b.txt), полностью его читает и вставляет в вывод после текущей строки.

Как указано выше, эта sedкомандная строка будет печатать только вывод на терминал, без записи в какие-либо файлы. Вы можете перенаправить его в новый файл (а не во входные файлы!), Используя перенаправление вывода Bash:

sed '5r b.txt' a.txt > c.txt

Или вы можете напрямую изменить внешний входной файл a.txtс помощью переключателя sed's -i(для "на месте"). Если вы напишите его как -i.bak, он сначала создаст резервную копию исходного входного файла с суффиксом .bak:

sed -i '5r b.txt' a.txt

Пример:

$ cat a.txt 
January
February
March
April
May
October
November
December

$ cat b.txt 
June
July
August
September

$ sed '5r b.txt' a.txt
January
February
March
April
May
June
July
August
September
October
November
December
Byte Commander
источник
0

(Повторное использование элегантного примера от @ByteCommander :)

awk '1; NR==5 {system("cat b.txt")}' a.txt

источник