Adding two files

I have a file which entry is below
cat file1

user1
user2
user3

another file, which entry is below
cat file2

Proj1 Fin
Proj2 Marketing

I want O/P as below

Delete User Profile "user1" FROM Proj1 Fin
Delete User Profile "user1" FROM Proj2 Marketing
Delete User Profile "user2" FROM Proj1 Fin
Delete User Profile "user2" FROM Proj2 Marketing
Delete User Profile "user3" FROM Proj1 Fin
Delete User Profile "user3" FROM Proj2 Marketing

I wrote a small script as below but i am not getting require O/P. script and Output of script is below.
script

#!/bin/bash
for i in `cat file1`
do
for j in `cat file2`
do
echo "Delete User Profile \""$i"\" FROM "$j"" >> OP1
done
done

O/P of script

Delete User Profile "user1" FROM Proj1
Delete User Profile "user1" FROM Fin
Delete User Profile "user1" FROM Proj2
Delete User Profile "user1" FROM Marketing
Delete User Profile "user2" FROM Proj1
Delete User Profile "user2" FROM Fin
Delete User Profile "user2" FROM Proj2
Delete User Profile "user2" FROM Marketing
Delete User Profile "user3" FROM Proj1
Delete User Profile "user3" FROM Fin
Delete User Profile "user3" FROM Proj2
Delete User Profile "user3" FROM Marketing

Can anyone please help me what wrong I am doing. I tried to use awk but it also not working as per requirement.

Hello Anshu,

You can try following and let me know if this helps you.

while read line1; do while read line2; do echo "Delete User Profile \"$line1\" FROM $line2"; done < "file2"; done < "file1"
 

OR

while read line1
do
     while read line2
     do
        echo "Delete User Profile \"$line1\" FROM $line2"
     done < "file2"
done < "file1"
 

Output will be as follows.

Delete User Profile "user1" FROM Proj1 Fin
Delete User Profile "user1" FROM Proj2 Marketing
Delete User Profile "user2" FROM Proj1 Fin
Delete User Profile "user2" FROM Proj2 Marketing
Delete User Profile "user3" FROM Proj1 Fin
Delete User Profile "user3" FROM Proj2 Marketing
 

Or with an awk approach following may help you too.

 awk -vs1="\"" 'FNR==NR{A[++i]=$0;next} {for(j=1;j<=i;j++){print "Delete User Profile " s1 $0 s1 " FROM " A[j]}}' file2 file1
 

Thanks,
R. Singh

1 Like
#!/bin/ksh
 while read user
do
  while read proj nm
  do
    echo "Delete user profile \"${user}\" FROM ${proj} ${nm}"
  done < file2
done <file1 > OP1

Ignore this..I haven't seen the solution already provided

1 Like

Please use code tags, not icode tags!

The effect that bothers you is one of the drawbacks of the for construct, as it can't tell spaces embedded in lines/variables from item separators. Two while loops do help:

while read USER
  do while read PROJNR PRNAM
     do echo "Delete User Profile \""$USER"\" FROM "$PRNAM""
     done < file2
  done < file1

---------- Post updated at 11:56 ---------- Previous update was at 11:53 ----------

If you insist on the for loops, set IFS=$'\n' :

IFS=$'\n'
for i in `cat file1`;  do for j in `cat file2`;  do echo "Delete User Profile \""$i"\" FROM "$j"";  done;  done
Delete User Profile "user1" FROM Proj1 Fin
Delete User Profile "user1" FROM Proj2 Marketing
Delete User Profile "user2" FROM Proj1 Fin
Delete User Profile "user2" FROM Proj2 Marketing
Delete User Profile "user3" FROM Proj1 Fin
Delete User Profile "user3" FROM Proj2 Marketing
1 Like

Thanks to all,
while and IFS is working exactly as requirement ..!