Coding
Coding

Reputation: 1

Addition or Subtraction of a number from each element of a list using Tcl Script

I have a input file name "input.dat" with the values as:

7 0
9 9
0 2
2 1
3 4
4 6
5 7
5 6

And I want to add/subtract any number from column 2 by converting it into a list using Tcl Script. I have written the Tcl Script as follows:

set input [open "input.dat" r]
set data [read $input]
set values [list]
foreach line [split $data \n] {
    if {$line eq ""} {break}
    lappend values [lindex [split $line " "] 1]
}
puts "$values-2"
close $input

But the output comes out to be: 0 9 2 1 4 6 7 6-2

Can anybody help me, how to fix this problem ? or what is the error in the script ? It's also helpful if anybody can help me with a correct script.

Upvotes: 0

Views: 3019

Answers (2)

rawat89
rawat89

Reputation: 21

puts will treat it as a string, you'll have to use [expr $val - 2]

NOTE: If it doesn't work, it is possible your input list is a string not int or float (Depends on how the values were read). In this case you can use:

scan $val %d tmp

set newval [expr $tmp - 2]

puts $newval

This will convert your string to int before applying mathematical expressions. You can similarly convert to float by using %f in scan instead of %d

Upvotes: 0

Donal Fellows
Donal Fellows

Reputation: 137807

I'm still not 100% sure what you want, but the options all seem to be solvable with the lmap command, which is for applying an operation to each element of a list.

Here's how to concatenate each element with -2:

set values [lmap val $values {
    string cat $val "-2"
}]

Here's how to subtract 2 from each element:

set values [lmap val $values {
    expr {$val - 2}
}]

Upvotes: 2

Related Questions