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

10

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

задан G. Paschalis 27.08.2017 в 21:19
источник

3 ответа

7

head и tail solution

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

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

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

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

mv ~/c ~/a
  • mv перемещает файл c в файл a . Данные физически не перемещаются. Файл просто переименован, что экономит время.
ответ дан WinEunuuchs2Unix 27.08.2017 в 21:30
источник
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 -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 27.08.2017 в 22:59
0

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

awk '1; NR==5 {system("cat b.txt")}' a.txt
    
ответ дан JJoao 05.09.2017 в 16:24