How to perform multiple operations on a number before storing to a variable?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting How to perform multiple operations on a number before storing to a variable?
# 1  
Old 10-23-2015
How to perform multiple operations on a number before storing to a variable?

(I am using bash)
I have a command that will find the line number in a file by searching for a string where it exists.

Code:
linenumber=$(grep -n "string" $FILENAME | cut -d : -fi)

This returns the line number and removes the string. Now that I have the line number I want to subtract 4 from it and give me a new line number.

Code:
newlinenumber=$((linenumber - 4))

What I would like to do is find the line number and subtract by 4 BEFORE storing to the variable "linenumber" so I can avoid creating a new variable "newlinenumber" altogether. Essentially I want to combine the two with the idea pictured as follows:

Code:
linenumber=$(grep -n "string" $FILENAME | cut -d : -fi) | $((linenumber - 4))

I want to know the correct syntax to make this possible.
# 2  
Old 10-23-2015
Code:
linenumber=$(expr $(grep -n "string" $FILENAME | cut -d : -f1) - 4)

This User Gave Thanks to cjcox For This Post:
# 3  
Old 10-23-2015
Code:
linenumber=$(( $(grep -n "string" $FILENAME | cut -d : -f1) - 4 ))


Last edited by vgersh99; 10-23-2015 at 06:41 PM..
This User Gave Thanks to vgersh99 For This Post:
# 4  
Old 10-23-2015
How about LN=$(awk '/string/ {print NR - 4}' $FILENAME)?
This User Gave Thanks to RudiC For This Post:
# 5  
Old 10-23-2015
Thank you guys you are amazing. I went with RudiC's suggestion although all of them worked.
# 6  
Old 10-23-2015
Note that you can assign a new value to a variable that has already been set without creating another variable name. Instead of
Code:
linenumber=$(grep -n "string" $FILENAME | cut -d : -fi)
newlinenumber=$((linenumber - 4))

(and assuming that the cut -fi was a typo and you meant [ICODE]cut -f1[/ICODE)], you could use:
Code:
linenumber=$(grep -n "string" $FILENAME | cut -d : -f1)
linenumber=$((linenumber - 4))

and, you can get rid of the cut completely with:
Code:
linenumber=$(grep -n "string" $FILENAME))
linenumber=${linenumber%%:*}
linenumber=$((linenumber - 4))

which also keeps you from getting a syntax error if more than one line in your file contains "string" (in which case this will set linenumber to the number of the 1st line in the file containing "string" minus four). And, this could also be written as:
Code:
linenumber=$(grep -n "string" $FILENAME))
linenumber=$((${linenumber%%:*} - 4))

or:
Code:
linenumber=$(awk '/string/ {print NR - 4; exit}' $FILENAME )

or, if there is a chance that "string" won't appear in the file at all:
Code:
linenumber=$(awk '/string/ {print NR - 4; f=1; exit} END {if(!f) print -1}' $FILENAME )

(where the print -4 in the END section matches what the above bash code does if there are no matches).
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Storing multiple sql queries output into variable by running sql command only once

Hi All, I want to run multiple sql queries and store the data in variable but i want to use sql command only once. Is there a way without running sql command twice and storing.Please advise. Eg : Select 'Query 1 output' from dual; Select 'Query 2 output' from dual; I want to... (3 Replies)
Discussion started by: Rokkesh
3 Replies

2. UNIX for Advanced & Expert Users

Passing variable as input & storing output in other variable

I have a below syntax its working fine... var12=$(ps -ef | grep apache | awk '{print $2,$4}') Im getting expected output as below: printf "%b\n" "${VAR12}" dell 123 dell 456 dell 457 Now I wrote a while loop.. the output of VAR12 should be passed as input parameters to while loop and results... (5 Replies)
Discussion started by: sam@sam
5 Replies

3. Shell Programming and Scripting

Getting lines between patterns and perform operations

Hi, I'm currently dev'ing using awk and I'm currently stuck. Here's the file, with comments on "<--- ": Record <--- First Pattern Amount 1 <--- Amount on first transaction TotalSales 0 <--- Total Sales Prior from previous transactions Time 1:00:00 <--- Time... (9 Replies)
Discussion started by: Jin_
9 Replies

4. Shell Programming and Scripting

Storing multiple file paths in a variable

I am working on a script for Mac OS X that, among many other things, gets a list of all the installed Applications. I am pulling the list from the system_profiler command and formatting it using grep and awk. The problem is that I want to be able to use each result individually later in the script.... (3 Replies)
Discussion started by: cranfordio
3 Replies

5. Shell Programming and Scripting

storing multiple values in a array variable

Am using a find command in my script .The output may be one or more. I need to store those values in a array and need to access those. Am unable to find the solution . Any help on this will be helpful. if < code> else a=<find command output which gives the file name either 1 or more> if 1... (1 Reply)
Discussion started by: rogerben
1 Replies

6. Shell Programming and Scripting

Perform operations as a non root user

Hi All, I need a help in the below scenario. I want to perform few operations as a non root user but those operations can be performed only by the root user. For example I need to modify /etc/hosts file as a non root user. This is just one scenario. Could you please provide... (3 Replies)
Discussion started by: kalpeer
3 Replies

7. Shell Programming and Scripting

perform 3 awk commands to multiple files in multiple directories

Hi, I have a directory /home/datasets/ which contains a bunch (720) of subdirectories called hour_1/ hour_2/ etc..etc.. in each of these there is a single text file called (hour_1.txt in hour_1/ , hour_2.txt for hour_2/ etc..etc..) and i would like to do some text processing in them. Each of... (20 Replies)
Discussion started by: amarn
20 Replies

8. Shell Programming and Scripting

Perform Operations on One File Conditional on Data in Another File

Hello all, I am looking for a solution to the following problem. Perl or python solutions also welcome. Given this input: And this input: I want to get this output. The rule being that if the number in the first file is < 0.9, then the corresponding two columns on... (2 Replies)
Discussion started by: hydrabane
2 Replies

9. Shell Programming and Scripting

Can sed perform editing operations ONLY in the matched region?

Hi: Let's suppose I want to replace all the | by > ONLY when | is between . Usually (and it works) I would do something like sed -e 's/\(\*\)|\(*\]\)/\1>\2/g' where I have to "save" some portions of the matched region and use them with the \n metacharacter. I was wondering if I could... (2 Replies)
Discussion started by: islegmar
2 Replies

10. UNIX for Dummies Questions & Answers

Storing Multiple Values in a Variable

Hi, My code is as below: integer i=7 while ((i <= 5 )); do # test_out is a variable which contains data separated by "^". a= `echo $test_out | cut -d"^" -f$i` echo "$a" (( i = i + 1)); done From the above code, i kept $i after f so that i can capture all the data which is... (1 Reply)
Discussion started by: sandeep_1105
1 Replies
Login or Register to Ask a Question