在 TCL 中使用 AWK 仅更改文本文件的一部分

Change only a part of text file using AWK in TCL

我只想使用 AWK 更改文本文件的特定值,并按原样保留其余值。

输入文件,ene.txt:

energy_of_node 1 48.03004556
energy_of_node 2 56.05655687
energy_of_node 3 48.03004556
energy_of_node 4 56.05655687
energy_of_node 5 48.03004556
energy_of_node 6 56.05655687
energy_of_node 7 48.03004556
energy_of_node 8 56.05655687

我需要更改由 TCL 提供的变量值。

my_code.tcl:

to_node = 7
exec awk -f drain.awk -v var=$to_node ene.txt

drain.awk:

#Here I need to alter the value of var to 0.000100
BEGIN{} {
if( == var) { 
==0.000100 
# but this definitely will not work, since this changes the entire file.  
}
}
END {
}

这应该适合你:

exec awk -v var=$to_node {==var{="0.00010"}1} ene.txt

请注意 awk 程序遵循以下方案:

CONDITION { ACTION } [ CONDITION2 { ACTION2 } ... ]

其中 { ACTION } 是可选的。如果不指定,awk 将打印当前行。

上面的程序包含两个这样的表达式:

==var {  = "0.00010" }
1

第一个检查条件 ==var 是否为真并在这种情况下执行操作 { = "0.00010" }

第二个只包含一个条件:1,它将始终计算为真并打印当前行,因为没有指定任何操作。


顺便说一句,上面的命令没有输出任何东西,因为你错过了打印它。你需要 puts:

puts [exec awk -v var=$to_node {==var{="0.00010"}1} ene.txt]

如果你想将结果返回到原始文件,你需要使用这样的东西:

set to_node 7
# Execute awk and store the output in $result
set result [exec awk -v var=$to_node {==var{="0.00010"}1} a.txt ]
# Open the file for writing and truncate it to zero length
set fd [open "a.txt" "w"]
# Write the result back to the file
puts $fd $result
# Close the file
close $fd

根本不需要调用awk:

set in [open ene.txt r]
set tempfile /tmp/ene.txt.[pid].[clock seconds]
set out [open $tempfile w]
while {[gets $in line] != -1} {
    set fields [split $line]
    if {[lindex $fields 1] == 7} {
        lset fields 2 0.000100
    }
    puts $out [join $fields]
}
close $in
close $out
file rename -force $tempfile ene.txt