We assume that I have two files like this:
File1 :
F: user1 password1 F: user2 password2 F: user3 password3
File2 :
server1 24000 server2 24000 server3 24000 server4 24000
I want to combine them in order to get one file with this output file :
OuputFile :
C: server1 24000 user1 password1 C: server2 24000 user1 password1 C: server3 24000 user1 password1 C: server4 24000 user1 password1 C: server1 24000 user2 password2 C: server2 24000 user2 password2 C: server3 24000 user2 password2 C: server4 24000 user2 password2 C: server1 24000 user3 password3 C: server2 24000 user3 password3 C: server3 24000 user3 password3 C: server4 24000 user3 password3
So, in Windows, I made this batch file to get what I expected, but, I have no idea how to do it in BASH (Bourne-Again shell) or in Python script.
The Batch File :
@echo off set file1=file1.txt set file2=file2.txt Set Output=Output_CCCam.cfg If Exist %Output% Del %Output% for /f "tokens=2 delims=:" %%a in ('Type "%file1%"') do ( for /f "delims=" %%b in ('Type "%file2%"') do ( >>%Output% echo C: %%b %%a ) ) Start "" Notepad %Output%
Advertisement
Answer
A Bash solution
#!/bin/bash while IFS= read -r line1; do while IFS= read -r line2; do printf "C: %s %sn" "$line2" "${line1/#F: }" done < file2 done < file1
This loops over file1
, and for each line of file1
loops over file2
. The printf
line assembles the output, and the parameter expansion for line
removes the leading F:
.
Result:
C: server1 24000 user1 password1 C: server2 24000 user1 password1 C: server3 24000 user1 password1 C: server4 24000 user1 password1 C: server1 24000 user2 password2 C: server2 24000 user2 password2 C: server3 24000 user2 password2 C: server4 24000 user2 password2 C: server1 24000 user3 password3 C: server2 24000 user3 password3 C: server3 24000 user3 password3 C: server4 24000 user3 password3
A solution with join and sed
This would work as well:
join -j 50 -o 2.1,1.1 -t '~' file1 file2 | sed s'/~F:/ /;s/^/C: /'
This is a slight abuse of join
. -j 50
says to join on matching field number 50, which doesn’t exist and is thus considered equal for all lines, resulting in the Cartesian product of the two files:
$ join -j 50 file1 file2 F: user1 password1 server1 24000 F: user1 password1 server2 24000 F: user1 password1 server3 24000 F: user1 password1 server4 24000 F: user2 password2 server1 24000 F: user2 password2 server2 24000 F: user2 password2 server3 24000 F: user2 password2 server4 24000 F: user3 password3 server1 24000 F: user3 password3 server2 24000 F: user3 password3 server3 24000 F: user3 password3 server4 24000
To get the lines into proper order, we specifiy the output format with -o 2.1,1,1
. Because the default field delimiter is whitespace, we specify a character that is not contained in the input as the new delimiter with -t '~'
:
$ join -j 50 -o 2.1,1.1 -t '~' file1 file2 server1 24000~F: user1 password1 server2 24000~F: user1 password1 server3 24000~F: user1 password1 server4 24000~F: user1 password1 server1 24000~F: user2 password2 server2 24000~F: user2 password2 server3 24000~F: user2 password2 server4 24000~F: user2 password2 server1 24000~F: user3 password3 server2 24000~F: user3 password3 server3 24000~F: user3 password3 server4 24000~F: user3 password3
And finally, we replace ~F:
with a space on each line and prepend C:
using sed:
$ join -j 50 -o 2.1,1.1 -t '~' file1 file2 | sed 's/~F:/ /;s/^/C: /' C: server1 24000 user1 password1 C: server2 24000 user1 password1 C: server3 24000 user1 password1 C: server4 24000 user1 password1 C: server1 24000 user2 password2 C: server2 24000 user2 password2 C: server3 24000 user2 password2 C: server4 24000 user2 password2 C: server1 24000 user3 password3 C: server2 24000 user3 password3 C: server3 24000 user3 password3 C: server4 24000 user3 password3
If the order of the lines doesn’t matter, this can be slightly shortened to
$ join -j 50 file2 file1 | sed 's/F://;s/^/C:/' C: server1 24000 user1 password1 C: server1 24000 user2 password2 C: server1 24000 user3 password3 C: server2 24000 user1 password1 C: server2 24000 user2 password2 C: server2 24000 user3 password3 C: server3 24000 user1 password1 C: server3 24000 user2 password2 C: server3 24000 user3 password3 C: server4 24000 user1 password1 C: server4 24000 user2 password2 C: server4 24000 user3 password3