Edit $args within a command


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers Edit $args within a command
# 1  
Old 11-06-2014
Edit $args within a command

Hi,
I'm using a while loop for a given command "bowtie2" with several parameters.

Code:
mkdir clean
paste <(ls --quote-name ./qc/sg_*_R1_val_1.fq.gz) <(ls --quote-name ./qc/sg_*_R2_val_2.fq.gz) |sed 's/"./-1 ./' | sed 's/gz"\t/gz\t -2 /' | sed 's/"//g' |\
      while read args ; do
                           bowtie2  -x ./MrBean_genome_final/dl_mt -p 4 -k 1 -N 1 -L 25 $args --un-conc-gz ./clean/{$args | sed -e 's/.fq.gz.*$//' -e 's/-1 .\/qc\///' -e 's/_R1_val_1//' }.gz -S a.sam

done

so the $args is actually edited to feed two parameters "-1" and "-2"
Code:
 paste <(ls --quote-name ./qc/sg_*_R1_val_1.fq.gz) <(ls --quote-name ./qc/sg_*_R2_val_2.fq.gz) |sed 's/"./-1 ./' | sed 's/gz"\t/gz\t -2 /' | sed 's/"//g'
-1 ./qc/sg_21_L001_R1_val_1.fq.gz        -2 ./qc/sg_21_L001_R2_val_2.fq.gz
-1 ./qc/sg_21_L002_R1_val_1.fq.gz        -2 ./qc/sg_21_L002_R2_val_2.fq.gz
-1 ./qc/sg_22_L001_R1_val_1.fq.gz        -2 ./qc/sg_22_L001_R2_val_2.fq.gz
-1 ./qc/sg_22_L002_R1_val_1.fq.gz        -2 ./qc/sg_22_L002_R2_val_2.fq.gz
-1 ./qc/sg_23_L001_R1_val_1.fq.gz        -2 ./qc/sg_23_L001_R2_val_2.fq.gz
-1 ./qc/sg_23_L002_R1_val_1.fq.gz        -2 ./qc/sg_23_L002_R2_val_2.fq.gz
-1 ./qc/sg_25_L001_R1_val_1.fq.gz        -2 ./qc/sg_25_L001_R2_val_2.fq.gz

For the parameter "--un-conc-gz" I was trying to feed it by editing with sed the $arg,

Code:
--un-conc-gz ./clean/{$args | sed -e 's/.fq.gz.*$//' -e 's/-1 .\/qc\///' -e 's/_R1_val_1//' }.gz

to feed iteratively "--un-conc-gz" with this
Code:
sg_21_L001
sg_21_L002
sg_22_L001
sg_22_L002
sg_23_L001
sg_23_L002
sg_25_L001

Can I do this? Do I need a loop within the loop, if so how?

P.S. the sed editing is OK, no need to focus there.

Many thanks in advance.

---------- Post updated at 04:15 PM ---------- Previous update was at 10:37 AM ----------

Update, I added the echo,
Code:
--un-conc-gz ./clean/{echo "$args" | sed 's/.fq.gz.*$//' |sed 's/-1 .\/qc\///' |sed 's/_R1_val_1//'}.gz

but I get an error message
Quote:
sed: invalid option -- S
.
# 2  
Old 11-06-2014
Perhaps you could simplify this and show us what you are trying to achieve for the call to bowtie and describe the inputs (file list etc.) and what you want it to end up calling it with. It is a little hard work to decipher your code without any design or comments and I worry about missing something vital.

Can you just explain the logic you use to get the bowtie calls?


Thanks, in advance,
Robin
# 3  
Old 11-06-2014
OK, I'll try to simplify with an example and remove the non essential for the question.
Thanks.

---------- Post updated at 05:19 PM ---------- Previous update was at 04:50 PM ----------

Using while loop for a given command with several parameters,

Code:
arguments |\
      while read args ; do
                           command  $args --un-conc-gz {echo $args | sed 'editing' } --several --others --parameters
done

so the arguments is actually edited to feed two parameters "-1" and "-2"
Code:
 
-1 ./path/file_a_1        -2 ./path/file_a_2
-1 ./path/file_b_1        -2 ./path/file_b_2
-1 ./path/file_c_1        -2 ./path/file_c_2

For the command parameter "--un-conc-gz" I was trying to feed it by reediting the $arg with sed,

Code:
echo $args | sed 'editing'
file_a
file_b
file_c

and I manage to get, file_a, file_b and file_c but I guess is not doing it iteratively with the $args.


So it would perfom the following commands
Code:
command -1 ./path/file_a_1 -2 ./path/file_a_2 --un-conc-gz file_a --several --others --parameters
command -1 ./path/file_b_1 -2 ./path/file_b_2 --un-conc-gz file_b --several --others --parameters
command -1 ./path/file_c_1 -2 ./path/file_c_2 --un-conc-gz file_c --several --others --parameters

Hope this is more clear!
# 4  
Old 11-06-2014
If all the commands to run are based with the 1 and 2 effectively being literal, could you do this:-
Code:
find . -type f | while read path_file         # Or however you generate your file list
do
   file="${path_file##*/}"                    # Get just the file bit, dropping the path
   echo "command -1 ${path_file}_1 -2 ${path_file}_2 --un-conc-gz $file --several --others --parameters"
done

If it displays what you want, take out the echo and double quotes.

If I've missed the point, let me know where I've gone wrong and I will have another think.


Regards,
Robin
This User Gave Thanks to rbatte1 For This Post:
# 5  
Old 11-06-2014
You may want to write a Perl wrapper with the YAML library. Perl and YAML are really good at reading configuration files. You would then have a configuration file with all of the parameters that you need to make the bowtie2 call, you can parse all of the inputs and more simply change the inputs to what you need and make it work. It would probably be easier to read and understand then the approach you are taking. etc..etc..

Here is the install page for YAML. I am using Perl and YAML to build a software installer. The customer will only need to provide the response file to make it work. Which is much easier than handling each parameter separately. And I can directly reference any parameter as $yaml_hash->{field_name}.

YAML - search.cpan.org
This User Gave Thanks to gandolf989 For This Post:
# 6  
Old 11-07-2014
@rbatte1
Seems perfect, I'll try it later on.
Update you on the results later on.

Many thanks!

---------- Post updated 07-11-14 at 11:46 AM ---------- Previous update was 06-11-14 at 05:51 PM ----------
@rbatte1
It works! After some slight changes (in bold) because of my files names
Code:
find ./path/ -type f | sed -e 's/_R.*$//' -e 's/_R//'|sort -u | while read path_file         # Or however you generate your file list
do
    file="${path_file##*/}"                    # Get just the file bit, dropping the path
  echo "command -1 ${path_file}_R1_val_1.fq.gz -2 ${path_file}_R2_val_2.fq.gz --un-conc-gz $file --several --others --parameters"
done

it gives this expected output:

Quote:
command -1 ./path/fileA_R1_val_1.fq.gz -2 ./path/fileA_R2_val_2.fq.gz --un-conc-gz fileA --several --others --parameters
command -1 ./path/fileB_R1_val_1.fq.gz -2 ./path/fileB_R2_val_2.fq.gz --un-conc-gz fileB --several --others --parameters
command -1 ./path/fileC_R1_val_1.fq.gz -2 ./path/fileC_R2_val_2.fq.gz --un-conc-gz fileC --several --others --parameters
command -1 ./path/fileD_R1_val_1.fq.gz -2 ./path/fileD_R2_val_2.fq.gz --un-conc-gz fileD --several --others --parameters
Many thanks for your help! Smilie

@gandolf989
Thanks for the suggestion, actually the command is already a perl wrapper.
That is away ahead for my state of knowledge, hope to get there some day...
This User Gave Thanks to sargotrons For This Post:
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Store args passed in array but not the first 2 args

Store args passed in array but not the first 2 args. # bash declare -a arr=("$@") s=$(IFS=, eval 'echo "${arr}"') echo "$s" output: sh array.sh 1 2 3 4 5 6 1,2,3,4,5,6 Desired output: sh array.sh 1 2 3 4 5 6 3,4,5,6 (2 Replies)
Discussion started by: iaav
2 Replies

2. Emergency UNIX and Linux Support

Cut | command line args

Hi, Can you please hint me how to achieve the below? Input: $./script.sh start 1 2 Internally inside the script i want to set a single variable with $2 and $3 value? Output: CMD=$1 ARGS=$2 $3 --VInodh (10 Replies)
Discussion started by: vino_hymi
10 Replies

3. Shell Programming and Scripting

command line args in unix

Hi, i have a perl script named test.pl. It is executed as cat *.log|test.pl i need the complete command line args. I tried using basename $0 but im getting test.pl only but not cat *.log... Can anyone help me on this. Thanks in advance (3 Replies)
Discussion started by: niteesh_!7
3 Replies

4. UNIX for Dummies Questions & Answers

UFW show args command

In ubuntu man page there is this command. What are values of ARGS I can use? (0 Replies)
Discussion started by: mojoman
0 Replies

5. Shell Programming and Scripting

How to send a function all command line args?

I have this code, I thought it would automatically know the args sent to script when called from shell. But it seems to not see any... main script: . args . errors . opt . clean dbfile="" opfile="" # calls function in script below chkarg #check commands (2 Replies)
Discussion started by: gcampton
2 Replies

6. Shell Programming and Scripting

How to retrieve command line args one by on.

Hi, I have to store all the command line arguments into an array. I have the following code. ********************** #! /bin/sh set -A arr_no_updates i=1 while do arr_no_updates=$($i) echo ${arr_no_updates} i=$(($i+1)) done**************** (1 Reply)
Discussion started by: little_wonder
1 Replies

7. UNIX for Dummies Questions & Answers

command line args 2

I have this while loop and at the end I am trying to get it to tell me the last argument I entered. And with it like this all I get is the sentence with no value for $1. Now I tried moving done after the sentence and it printed the value of $1 after every number. I don't want that I just want... (2 Replies)
Discussion started by: skooly5
2 Replies

8. UNIX for Dummies Questions & Answers

command line args

I am trying to print command line arguments one per second. I have this while do echo "6" shift echo "5" shift echo "4" shift echo "3" shift echo "2" shift echo "1" shift done (2 Replies)
Discussion started by: skooly5
2 Replies

9. Programming

Command line args

My program usage takes the form for example; $ theApp 2 "one or more words" i.e. 3 command line arguments; application name, an integer, some text My code includes the following 4 lines: int anInteger; char words; sscanf(argv, "%d", &anInteger); sscanf(argv, "%s", &message); Based... (2 Replies)
Discussion started by: enuenu
2 Replies

10. UNIX for Dummies Questions & Answers

required command line args

Hello, How do I make a command line argument required using getopts? Thanks. (6 Replies)
Discussion started by: yoi2hot4ya
6 Replies
Login or Register to Ask a Question