Read 2 input and produce it in single ouput?

Hi all.
I�ve 2 inputs here and would like to produce it in single ouput. I�ve drafted simple shell script but not sure how to put all this together. The final output should be �GROUP-XYZ� instead of �TEST�
Please advise.

INPUT1

GROUP-XYZ

INPUT2

type8code0@box:~/dbedit$ cat port.txt
80
443
type8code0@box:~/dbedit$

Expected output

type8code0@box:~/dbedit$ ./dbedit-script-service-group
   create service_group GROUP-XYZ
   create service_group GROUP-XYZ '' services:tcp80
   create service_group GROUP-XYZ '' services:tcp443
   type8code0@box:~/dbedit$

DRAFT SHELL SCRIPT

#!/bin/bash
   
   awk '{print "tcp"$1}' port.txt > temp-port.txt
   
   awk '{
   print "create service_group TEST";
   print "create service_group TEST \x27\x27 services:"$1;
   }' temp-port.txt

Unfortunately, this is not the expected output. Need to fix something on the draft code so that expected output can be produced. Please advise.

type8code0@box:~/dbedit$   ./dbedit-script-service-group
   create   service_group TEST
   create   service_group TEST '' services:tcp80
   create   service_group TEST
   create service_group   TEST '' services:tcp443
   type8code0@box:~/dbedit$

Hi, maybe this could work for you.

awk '
BEGIN { print "create service_group TEST"; }
{ print "create service_group TEST \x27\x27 services:tcp"$1 }' port.txt
1 Like

This is definitely better than my initial draft code :b:
Is it possible to replace �TEST" with any variable?

E.g.

Please type your new service group name: GROUP-XYZ

Final Output:

create service_group GROUP-XYZ
  create service_group GROUP-XYZ '' services:tcp22
  create service_group GROUP-XYZ '' services:tcp80
  create service_group GROUP-XYZ '' services:tcp443

With awk you could try something like this:

awk 'NR==FNR{A[$1]; next} {print s, $1; for(i in A) print s, $1, t i}' s="create service_group" t="'' services:tcp" file2 file

But perhaps shell script would do just fine here?

while read service_group
do
  printf "create service_group %s\n" "$service_group"
  while read port
  do
    printf "create service_group %s '' services:tcp%s\n" "$service_group" "$port"
  done < file2
done < file1
1 Like

I've tested and both solutions work like a charm. Thanks a lot :b::o

Since file1 only contains single word, is it possible to use interactive way. I was thinking something like this.

Please let me know how to combine this code into yours.

type8code0@box:~/dbedit$ cat test
echo -n "Enter new group name : "
read g
echo "You entered: $g"
type8code0@box:~/dbedit$
type8code0@box:~/dbedit$ ./test
Enter new group name : GROUP-XYZ
You entered: GROUP-XYZ
type8code0@box:~/dbedit$

You're welcome... You could adjust the shell loop like so, leaving out the first input file and reading from the terminal instead..

while 
  printf "Enter new group name : "
  read service_group
do
  printf "You entered: %s\n" "$service_group"
  printf "create service_group %s\n" "$service_group"
  while read port
  do
    printf "create service_group %s '' services:tcp%s\n" "$service_group" "$port"
  done < file2
done 
1 Like

This is perfect. Thanks again. :b::b::b::smiley:

Quick question, how to stop this loop besides using combination of Ctrl + C?

type8code0@box:~/dbedit$ ./test
Enter new group name : XYZ
You entered: XYZ
create service_group XYZ
create service_group XYZ '' services:tcp22
create service_group XYZ '' services:tcp80
create service_group XYZ '' services:tcp443
Enter new group name :
You entered:
create service_group
create service_group  '' services:tcp22
create service_group  '' services:tcp80
create service_group  '' services:tcp443
Enter new group name : ABC
You entered: ABC
create service_group ABC
create service_group ABC '' services:tcp22
create service_group ABC '' services:tcp80
create service_group ABC '' services:tcp443
Enter new group name :

You could add this to make it the loop stop for certain input, in this case a zero or no input at all (empty string):

while 
  printf "Enter new group name (enter 0 to stop): "
  read service_group
do
  printf "You entered: %s\n" "$service_group"
  case $service_group in
    0|"") break
  esac
  printf "create service_group %s\n" "$service_group"
  while read port
  do
    printf "create service_group %s '' services:tcp%s\n" "$service_group" "$port"
  done < file
done 

Of course, if it always only needs to be executed once, then you can leave out the outer loop altogether:

printf "Enter new group name : "
read service_group
printf "You entered: %s\n" "$service_group"
printf "create service_group %s\n" "$service_group"
while read port
do
  printf "create service_group %s '' services:tcp%s\n" "$service_group" "$port"
done < file2

Unless you add some tests for e.g. empty input or an "END" string entered, you can end the loop by end-of-file, which is CTRL-D.

CTRL-C is fine, btw.