Adding a specified value to a specified column - awk?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Adding a specified value to a specified column - awk?
# 1  
Old 04-04-2013
Adding a specified value to a specified column - awk?

Hi everyone!

I sometimes need to do some simple arithmetics, like adding a number to a certain column of a file. So I wrote a small function in the .bashrc file, which looks like this
Code:
 shifter()
 {
 COL=$1
 VAL=$2
 FILE=$3

 cp $FILE $FILE.shifted
 awk 'NF==4 {$(( $COL )) = $(( $COL )) + $VAL}' $FILE.shifted
 }

which should add the number stored in VAL, to the column COL from the FILE file.

Please give me a hint how should I make this work. Thank you! (I'm just a newbie in shell programing)
# 2  
Old 04-04-2013
You've got a pretty good grasp for a newbie, but a couple things of note.

Variables do not expand inside single quotes. Never have, never will. They do inside double quotes, but I don't reccomend using double quotes for awk code -- makes it awkward since you need to \-escape so many things.

Awk does not use shell variables, it's its own self-contained language with its own variables. You can get them into awk, but you have to put them there in the first place...

awk does not use $ to mean variable. $ means column in awk. So N=1; print $N would be equivalent to print $1 -- i.e. print the first column.

awk does not edit the file you give to it, it just prints it somewhere else. So you can use it instead of cp here, by sending the altered output into a new file.

Your awk statement prints no lines. The statement '1' outside a code block simply prints every line.

So:

Code:
shifter()
 {
        awk 'NF==4 {$COL += VAL } 1' COL=$1 VAL=$2 $3 > "$3.shifted"
 }

This User Gave Thanks to Corona688 For This Post:
# 3  
Old 04-05-2013
Hi Corona688!

I've tried your code, and it works if I get rid of the 'NF==4'. Thank you!
# 4  
Old 04-05-2013
Since you never posted your input data, I didn't know what the NF==4 was for.
# 5  
Old 04-08-2013
One more thing: although the script works, it does it with a low precission (meaning, having to many decimals, the script will consider only the first 4, or somethign like this).

What should I include in the script in order to keep the same precission or what flags/options should I send to awk in order to keep the same preccision?

Thank you!

An example
Code:
~/r/cu.t cat xx
 10.83000000  12.63500000  32.92017254 6
 12.63500000  10.83000000  32.92017254 6
~/r/cu.t shifter 3 45.11111111 xx 
~/r/cu.t cat xx.shifted 
10.83000000 12.63500000 78.0313 6
12.63500000 10.83000000 78.0313 6

What I would like is to have something like this
Code:
~/r/cu.t cat xx.shifted 
 10.83000000  12.63500000  78.03128365 6
 12.63500000  10.83000000  78.03128365 6

# 6  
Old 04-08-2013
awk uses 32-bit floating point numbers, its precision is not infinite. By default it prints to 6 digits, but this can be controlled by the CONVFMT variable. Hopefully this works for your need:
Code:
awk 'NF==4 {$COL += VAL } 1' COL=$1 VAL=$2 CONVFMT="%.8f" $3 > "$3.shifted"

This User Gave Thanks to Corona688 For This Post:
# 7  
Old 04-09-2013
Thank you once again, Corona688! Smilie
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Adding values of a column based on another column

Hello, I have a data such as this: ENSGALG00000000189 329 G A 4 2 0 ENSGALG00000000189 518 T C 5 1 0 ENSGALG00000000189 1104 G A 5 1 0 ENSGALG00000000187 3687 G T 5 1 0 ENSGALG00000000187 4533 A T 4 2 0 ENSGALG00000000233 5811 T C 4 2 0 ENSGALG00000000233 5998 C A 5 1 0 I want to... (3 Replies)
Discussion started by: Homa
3 Replies

2. UNIX for Dummies Questions & Answers

Des/awk for change format and adding integers in a column of data?

Greetings! I need a quick way to change the format in a table of data Here is an example of the input: 10 72 Value=177 VDB=0.0245 Value4=0,0,171,0 10 274 Value=238 VDB=0.0433 Value4=29,0,205,0 10 312 Value=222 VDB=0.0384 Value4=8,0,190,19 10 540 Value=405 VDB=0.0391 Value4=13,30,153,195... (3 Replies)
Discussion started by: Twinklefingers
3 Replies

3. UNIX for Dummies Questions & Answers

awk adding counts together from column

Hello Im new treat me nicely, I have a headache :) I have a script that seemed to work now it doesnt anyway, the last part is adding counts of unique items in a csv file eg 05492U34 38 05492U34 47 two columns, (many different values like this in file) i want... (7 Replies)
Discussion started by: aniquebmx
7 Replies

4. Shell Programming and Scripting

Rename a header column by adding another column entry to the header column name URGENT!!

Hi All, I have a file example.csv which looks like this GrpID,TargetID,Signal,Avg_Num CSCH74_1_1,2007,61,256 CSCH74_1_1,212007,647,679 CSCH74_1_1,12007,3,32 CSCH74_1_1,207,299,777 I want the output as GrpID,TragetID,Signal-CSCH74_1_1,Avg_Num CSCH74_1_1,2007,61,256... (4 Replies)
Discussion started by: Vavad
4 Replies

5. Linux

Adding a prefix to a column using awk/sed commands

Hello, I am a newbie to linux and struggling to find a better way to append a column in a text file. Here is the file i want to modify: It has 8 columns (and thousands of rows). I want to append the first column by adding "chr" infront of the numbers. Some rows have a string in the first... (4 Replies)
Discussion started by: bjorngill
4 Replies

6. Shell Programming and Scripting

Adding column using awk

Hello everyone, I have a file with the following structure: abc xyz 111 222 agf hjhf 787 799 tht yah 878 898 ... ... ... ... ... ... ... ... ... ... ... ... I want to add a column (with a fixed value of 1000) at the end such that it becomes: abc xyz 111 222 1000 agf hjhf 787... (5 Replies)
Discussion started by: ad23
5 Replies

7. UNIX for Dummies Questions & Answers

Adding a column with the row number using awk

Is there anyway to use awk to add a first column to my data that automatically goes from 1 to n , where n is the numbers of my rows?:confused: (4 Replies)
Discussion started by: cosmologist
4 Replies

8. Shell Programming and Scripting

sed/awk-adding numeric to a column

I have a txt file as follows Code: Oct 1 file1 4144 Oct 1 file23 5170 Oct 2 file5 3434 Oct 21 file56 2343 I need to add a new column by marking the right log file from current directory. For example populate like this. Please not in the second columt for "1" it has... (2 Replies)
Discussion started by: gubbu
2 Replies

9. Shell Programming and Scripting

awk-adding a column to a file

Hello Friends, i used awk to sum up total size of files under a directory (with the help of examples, threads here). ls -l | awk '/^-/ {total += $5} END {printf "%15.0f\n",total}' >> total.txt After each execution of the script total result is appended into a text file: 7010 7794 8890 ... (7 Replies)
Discussion started by: EAGL€
7 Replies

10. Shell Programming and Scripting

problem while adding column values in awk

Hi, I have a file "input.txt" with the following content : 5312,0,,,1,8,141.2,20090727 3714,0,,,1,8,285.87,20090727 5426,0,,,1,8,3.9,20090727 3871,0,,,1,8,30.4,20090727 9071,0,,,1,8,146.2,20090727 5141,0,,,1,8,2.8,20090727 0460,0,,,1,8,-0.1,20090727 7918,0,,,1,8,-0.1,20090727... (3 Replies)
Discussion started by: valokv
3 Replies
Login or Register to Ask a Question