Inserting file after specific line in another file

Im attempting to insert the contents of File1 at a specific point of File2.

File1

AD004 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1

File2

AA001 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AB002 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AC003 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1

Result

AA001 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AB002 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AC003 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AD004 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1

I used the following command but its not working -

sed "N;/AC003\n{$/r file1" file2 

What am I missing?

perl -0ne '$x=$_ if $.==1;$y=$_ if $.==2;$y=~s/AC003.*\n/$&$x/;print $y' file1 file2

AWK:

awk '/AC003/{print;while ((getline x < "file1") > 0) print x;next}1' file2

Thanks for the quick response.

Both those work for inserting above the declared line, but it leaves in 1 of the 125+ lines at the top. For example -

Result

AA001 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AB002 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AC003 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AZ027 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AD004 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AE005 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AF006 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
BZ001 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
CZ002 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1

Should be

AA001 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
 AB002 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
 AC003 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
 AD004 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AE005 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AF006 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AZ027 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
 BZ001 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
CZ002 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1

Try:

sed '/AC003/rFile1' File2

That does not work. File1 is inserted after each

AA001 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1

So it looks like

AA001 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
File 1
AA002 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
File 1
AA003 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
File 1

Any other suggestions?

awk '/AC003/ {print;while (getline<"file1">0) print;next} {print}' file2

Just sort the 2 files and put the result into an output file...

sort -k1,1n file1 file2 > outfile

What OS and version are you using?

I get:

$ sed '/AC003/rfile1' file2
AA001 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AB002 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AC003 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1
AD004 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1

Again this works, but like the others it leaves in the first line of the set its looking for.

File 1

AU1150002001  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  
AU1150002002  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  
AU1150002003  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  
AC0030002001  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9    
AC0030002002  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9    
AC0030002003  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  

File 2

ER12100021001  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  
ER12100021002  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9     
ER12100021003  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9   

Output

AU1150002001  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  
AU1150002002  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  
AU1150002003  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  
AC0030002001  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9    
ER1210001001  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  
 ER1210001002  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9     
 ER1210001003  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9 
AC0030002002  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9    
 AC0030002003  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9    

With your latest example:

$ sed '/AC003/rfile2' file1
AU1150002001  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  
AU1150002002  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  
AU1150002003  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  
AC0030002001  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9    
ER12100021001  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  
ER12100021002  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9     
ER12100021003  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9
AC0030002002  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9    
ER12100021001  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  
ER12100021002  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9     
ER12100021003  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9
AC0030002003  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9
ER12100021001  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  
ER12100021002  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9     
ER12100021003  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9  -99.9

Sun Solaris 10

Try a space between r and "file1":

sed '/AC003/r file1' file2
1 Like

OK - you want it after each appearance of AC003?

awk '/AC003/ {print;while (getline<"file2">0) print; close("file2");next} {print}' file1 

Scrutinizers genious line works also at my Solaris 8 WITH space

sed '/AC003/r file2' file1

Thanks Scrutinizer;)

1 Like
awk '/AC003/ {print;while (getline<"file2">0) print; close("file2");next} {print}' file1 

This works perfect - thanks!