Як я можу скопіювати вміст текстового файлу та вставити його до іншого, починаючи з певного рядка?


13

Мені потрібно скопіювати вміст текстового файлу та вставити його в інший текстовий файл. Перший текстовий файл містить 10 рядків даних, і мені потрібно їх скопіювати у другий текстовий файл, починаючи з рядка № 5 (наприклад). Отже, у другому текстовому файлі ці дані слід записати з рядка 5 до рядка 14. Як це можна зробити? Заздалегідь спасибі. Розгляньте мене як новачка щодо Linux.

Відповіді:


10

headі tailрішення

Припустимо, що викликовий файл викликається, ~/aі файл, який потрібно вставити, називається ~/b. Ми поставимо об'єднаний файл у ~/c:

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

Після перевірки перейменуйте об'єднаний файл

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

mv ~/c ~/a
  • mvпереміщує файл cу файл a. Дані фізично не переміщені. Файл просто перейменований, що економить час.

Спасибі за вашу відповідь. Це спрацювало чудово. Однак чи є інший спосіб зробити це без використання третього текстового файлу?
Г. Пашаліс

Третій файл може бути перейменований у вихідний файл після завершення. Я вважав, що найкраще мати можливість спочатку переглянути файл. Додамо додаткові кроки до відповіді зараз.
WinEunuuchs2Unix

Або ...(head -n 5 a.txt ; cat b.txt ; tail -n +6 a.txt) > c.txt

1
@JJoao Це хороший підсумок з одного рядка :) Для навчальних цілей я вважаю за краще використовувати один рядок за командним методом, а вкладений у заяви. Однак для копіювання та вставлення в термінал я люблю один вкладиш!
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, використовуючи перемикач seds -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

0

(Повторне використання елегантного прикладу від @ByteCommander :)

awk '1; NR==5 {system("cat b.txt")}' a.txt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.