How to insert a string and variable at specified position in command in bash?


 
Thread Tools Search this Thread
Top Forums UNIX for Beginners Questions & Answers How to insert a string and variable at specified position in command in bash?
# 1  
Old 12-15-2019
How to insert a string and variable at specified position in command in bash?

I currently have a loop that reads all .bam files in a directory (wont always be 4 like in this example,
into $id. What I am trying to do, unsucessfully, is create specific new lines in an exsisting command using
each $id. Each new line would be:
Code:
--bam ${id} \

Tried
Code:
p=$dir
/path/to/xxx.py \
text="$(--bam ${id \})"
text="${text:0:p}j${text:p}"  ## insert text for each $p
     --ref /path/to/file \
     --run /ptah/to/data

directory
Code:
s1.bam
s2.bam
s3.bam
s4.bam

standard command
Code:
/path/to/xxx.py \
     --bam ${id}.bam \
     --ref /path/to/file \
     --run /ptah/to/data

desired command
Code:
/path/to/xxx.py \
     --bam s1.bam \
	 --bam s2.bam \
	 --bam s3.bam \
	 --bam s4.bam \
	 --ref /path/to/file \
     --run /path/to/data


Last edited by cmccabe; 12-15-2019 at 11:08 AM.. Reason: fixed format
# 2  
Old 12-15-2019
Not sure I fully understand, and your "Tried" block seems to be gobbledigook, but how about
Code:
while IFS="" read -r LN
  do    [ "$LN" = "${LN##*id}" ] && echo "$LN" || for FN in *.bam
                                                    do echo "     -- bam $FN \\"
                                                    done
  done < file
/path/to/xxx.py \
     -- bam s1.bam \
     -- bam s2.bam \
     -- bam s3.bam \
     -- bam s4.bam \
     --ref /path/to/file \
     --run /ptah/to/data


EDIT: or
Code:
ls *.bam | awk 'NR == FNR {T = T DL "     --bam " $0 " \\"; DL = RS; next} /id/ {print T; next} 1' - file


Last edited by RudiC; 12-15-2019 at 11:52 AM..
This User Gave Thanks to RudiC For This Post:
# 3  
Old 12-16-2019
I am trying to insert each $id into the standard command below above the ref following the format -- bam ${id} \. There won't always be
4 $id, that will change each time. Maybe storing each $id in a variable and then inserting that into the command? Thank you Smilie.

Code:
insert=$(awk -v fn=--bam $id \'
   { 
     if( index( $0, fn ) )
       print;
   }')
/path/to/xxx.py \
${insert}
--ref /path/to/file \
--run /path/to/data

echo $id
Code:
s1.bam
s2.bam
s3.bam
s4.bam

standard command
Code:
/path/to/xxx.py \
--bam ${id} \
--ref /path/to/file \
--run /path/to/data

desired command using all 4 .bam in id on a seperate line
Code:
/path/to/xxx.py \
--bam ${id} \
--bam ${id} \
--bam ${id} \
--bam ${id} \
--ref /path/to/file \
--run /path/to/data


Last edited by cmccabe; 12-16-2019 at 09:38 AM.. Reason: fixed format
# 4  
Old 12-16-2019
That desired command is different from the one in post #1. What exactly and finally do you need?



Why the detour using $id in lieu of using the file names in the directory immediately?

Last edited by RudiC; 12-16-2019 at 01:49 PM..
This User Gave Thanks to RudiC For This Post:
# 5  
Old 12-16-2019
Do you want something more like:
Code:
printf -- "/path/to/xxx.py \\\\\n%s\n\t--ref /path/to/file \\\\\n\t--run /path/to/data\n" \                       # Set up the output format with fixed strings and an assignment for where the data goes
   "$(for bamfile in *.bam; do printf -- "\t\t--bam %s \\\\\n"    "${bamfile}"; done)"                            # Collect & list the data file lines here, tab indenting each with \t and finishing with the formatting to append the \ and the new-line
                                                                                                                  # This will get used in the above line as the input for the data.

Lots of escaping in the strings which makes it look a bit messy, but it seems to work for me. After creating dummy files as you have, I got the output:-
Code:
/path/to/xxx.py \
		--bam s1.bam \
		--bam s2.bam \
		--bam s3.bam \
		--bam s4.bam \
	--ref /path/to/file \
	--run /path/to/data

Does this do what you need?


Robin

Last edited by rbatte1; 12-17-2019 at 07:07 AM..
These 3 Users Gave Thanks to rbatte1 For This Post:
# 6  
Old 12-16-2019
The id contains the unique prefix of each bam, so the s1,s2,s3,s4.

I am trying to insert each of those into the command in post 3. That is make the command dependent or conditional on id. So if there are 4 id then there are 4 --bam ${id} \ inserted and if there are 7 id then 7 --bam ${id} \ inserted in the command. There may be a better way that I am not thinking of. Thank you Smilie.
# 7  
Old 12-16-2019
Oh? Changing basic data again?


Be aware that a good, decent, stable, consistent specification helps everyone dealing with your request, saving time and efforts.


And, either of the three solutions given above can easily be adapted to your old and new and ever changing data (structures). This is left as an exercise to the interested reader.
This User Gave Thanks to RudiC For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

How to insert subnode in xml file using xmlstarlet or any other bash command?

I have multiple xml files where i want to update a subnode if the subnode project points to different project or insert a subnode if it doesn't exist using a xmlstarlet or any other command that can be used in a bash script. I have been able to update the subnode project if it doesn't point to... (1 Reply)
Discussion started by: Sekhar419
1 Replies

2. UNIX for Beginners Questions & Answers

Bash: Insert in a variable a file

hi all i have a problem in the bash shell. i'd like insert in a variable a file for example : i have a file datafine.log in this file there is : 17/JUN/2019 i want to insert the value of datafine.log in a variable. Regards Frncesco edit by bakunin: please use CODE-tags for your data... (2 Replies)
Discussion started by: Francesco_IT
2 Replies

3. Shell Programming and Scripting

Search for a string at a particular position and replace with blank based on position

Hi, I have a file with multiple lines(fixed width dat file). I want to search for '02' in the positions 45-46 and if available, in that lines, I need to replace value in position 359 with blank. As I am new to unix, I am not able to figure out how to do this. Can you please help me to achieve... (9 Replies)
Discussion started by: Pradhikshan
9 Replies

4. Shell Programming and Scripting

Need command or script to print all lines from 2nd position to last but one position

hi guys, i want command or script to display the content of file from 2nd position to last but one position of a file abcdefghdasdasdsd 123,345,678,345,323 434,656,656,656,656 678,878,878,989,545 4565656667,65656 i want to display the same above file without first and... (2 Replies)
Discussion started by: hemanthsaikumar
2 Replies

5. Shell Programming and Scripting

Insert charactera in 1st position of specific lines using vi editor or sed command

Dear all, i am having text file like below surya rama ranga laxman rajesh reddy i want add string (OK) before a text from line 3 to 5 the result will be surya rama OK ranga OK laxman OK rajesh reddy (1 Reply)
Discussion started by: suryanarayana
1 Replies

6. Shell Programming and Scripting

sed or awk command to replace a string pattern with another string based on position of this string

here is what i want to achieve... consider a file contains below contents. the file size is large about 60mb cat dump.sql INSERT INTO `table1` (`id`, `action`, `date`, `descrip`, `lastModified`) VALUES (1,'Change','2011-05-05 00:00:00','Account Updated','2012-02-10... (10 Replies)
Discussion started by: vivek d r
10 Replies

7. UNIX for Dummies Questions & Answers

sed insert command and variable expansion/command substitution

I know this script is crummy, but I was just messing around.. how do I get sed's insert command to allow variable expansion to show the filename? #!/bin/bash filename=`echo $0` /usr/bin/sed '/#include/ { i\ the filename is `$filename` }' $1 exit 0 (8 Replies)
Discussion started by: glev2005
8 Replies

8. Shell Programming and Scripting

Insert a line including Variable & Carriage Return / sed command as Variable

I want to instert Category:XXXXX into the 2. line something like this should work, but I have somewhere the wrong sytanx. something with the linebreak goes wrong: sed "2i\\${n}Category:$cat\n" Sample: Titel Blahh Blahh abllk sdhsd sjdhf Blahh Blah Blahh Blahh Should look like... (2 Replies)
Discussion started by: lowmaster
2 Replies

9. Shell Programming and Scripting

search a line and insert string into specific at position

Hi, guys. I have one question: How can I search for a line with certain string in it and then insert a string into this line? For example: There is a file called shadow, the contents of it are below: ************************** ... yuanz:VIRADxMsadfDF/Q:0:0:50:7:::... (9 Replies)
Discussion started by: daikeyang
9 Replies

10. Shell Programming and Scripting

how to find a position and print some string in the next and same position

I need a script for... how to find a position of column data and print some string in the next line and same position position should find based on *HEADER8* in text for ex: ord123 abs 123 987HEADER89 test234 ord124 abc 124 987HEADER88 test235 ... (1 Reply)
Discussion started by: naveenkcl
1 Replies
Login or Register to Ask a Question