16

I need to copy the content of a text file and paste it to another text file. The first text file has 10 lines of data and I need them to be copied to the second text file starting at line number 5 (for example). So in the second text file those data should written from line 5 to line 14. How can this be done? Thanks in advance. Consider me as a rookie regarding Linux.

Eliah Kagan
  • 117,780

3 Answers3

17

The easiest tool here might be sed. To insert b.txt into a.txt after the 5th line , you could write:

sed '5r b.txt' a.txt

sed reads the file specifiied as argument (a.txt) line by line. All lines get reproduced in the output just as they appeared in the input, unless they get altered by a command.

The 5 is an address (line number) at which the following command shall be executed. The command we use is r, which takes a file name as argument (here b.txt), reads it completely and inserts it into the output after the current line.

As it stands above, this sed command line will only print the output to the terminal, without writing to any files. You can either redirect it to a new file (not any of the input files!) using Bash's output redirection:

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

Or you can directly modify the outer input file a.txt by using sed's -i (for "in-place") switch. If you write it as -i.bak, it will make a backup copy of the original input file with the suffix .bak first:

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

An example:

$ 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
  • 107,489
11

head and tail solution

Assume the source file is called ~/a and the file to be inserted is called ~/b. We'll put the merged file into ~/c:

head -n 5 ~/a > ~/c
cat ~/b >> ~/c
tail --lines=+6 ~/a >> ~/c
  • The path ~/ is short hand for your /home/user directory name
  • head copies the first five lines of file a into newly created file c
  • cat lists the contents of file b and appends it to file c
  • tail appends file a starting at line 6 until the end to file c

After verification rename merged file

After verifying that file c is merged correctly from files a and b we'll rename c to a using:

mv ~/c ~/a
  • mv moves file c into file a. Data isn't physically moved. The file is simply renamed which saves time.
  • Thank you for your answer. It worked just fine. However is there another way to do this without using a third text file? – G. Paschalis Aug 27 '17 at 21:58
  • The third file can be renamed to the source file when done. I thought it best to be able to view the file first. I'll add the extra steps to the answer now. – WinEunuuchs2Unix Aug 27 '17 at 22:04
  • Or... (head -n 5 a.txt ; cat b.txt ; tail -n +6 a.txt) > c.txt –  Sep 05 '17 at 16:26
  • 1
    @JJoao That is a nice one line summary :) For teaching purposes I prefer to use the one line per command method and nested if statements. However for copy and pasting into terminal I love the one liners! – WinEunuuchs2Unix Sep 05 '17 at 17:27
0

(Reusing elegant example from @ByteCommander:)

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