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