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

在TCL中使用AWK仅更改文本文件的一部分,awk,tcl,ns2,Awk,Tcl,Ns2,我只想使用AWK更改文本文件的特定值,并保留其余的值 输入文件ene.txt: 我需要更改TCL提供的变量的值 my_code.tcl: drain.awk: 这应该适合您: exec awk -v var=$to_node {$2==var{$3="0.00010"}1} ene.txt 请注意,awk计划遵循以下方案: CONDITION { ACTION } [ CONDITION2 { ACTION2 } ... ] 其中,{ACTION}是可选的。如果未指定,awk将打印当前行 上

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

输入文件ene.txt:

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

my_code.tcl:

drain.awk:


这应该适合您:

exec awk -v var=$to_node {$2==var{$3="0.00010"}1} ene.txt
请注意,awk计划遵循以下方案:

CONDITION { ACTION } [ CONDITION2 { ACTION2 } ... ]
其中,
{ACTION}
是可选的。如果未指定,awk将打印当前行

上面的程序包含以下两个表达式:

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

第二个仅包含一个条件:
1
,该条件将始终计算为true,并将打印当前行,因为尚未指定任何操作


顺便说一句,上面的命令没有输出任何内容,因为您没有打印它。您需要
放置

puts [exec awk -v var=$to_node {$2==var{$3="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 {$2==var{$3="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

这应该适合您:

exec awk -v var=$to_node {$2==var{$3="0.00010"}1} ene.txt
请注意,awk计划遵循以下方案:

CONDITION { ACTION } [ CONDITION2 { ACTION2 } ... ]
其中,
{ACTION}
是可选的。如果未指定,awk将打印当前行

上面的程序包含以下两个表达式:

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

第二个仅包含一个条件:
1
,该条件将始终计算为true,并将打印当前行,因为尚未指定任何操作


顺便说一句,上面的命令没有输出任何内容,因为您没有打印它。您需要
放置

puts [exec awk -v var=$to_node {$2==var{$3="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 {$2==var{$3="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

您根本不需要向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


注意,Tcl中的
to_node=7
使用两个参数调用名为
to_node
的命令。要设置变量,请使用
set To_node 7
注意,Tcl中的
To_node=7
使用两个参数调用名为
To_node
的命令。要设置变量,请使用
set To_node 7
@glennjackman谢谢您的编辑!我没有注意到字符串在TCL中没有用引号括起来。这对我不起作用。我不懂。它也不会抛出任何错误!这是因为您不输出结果。如果要就地更改文件,需要获得结果,然后将其保存回
ene.txt
awk
不会在适当的位置更改文件。添加的
会放置
。现在你应该可以看到结果了。不过,我会看看答案。您根本不需要
awk
。使用它,我可以将更新的文本文件重定向到另一个文件。但这是否可能改变现有文件本身?@glennjackman感谢您的编辑!我没有注意到字符串在TCL中没有用引号括起来。这对我不起作用。我不懂。它也不会抛出任何错误!这是因为您不输出结果。如果要就地更改文件,需要获得结果,然后将其保存回
ene.txt
awk
不会在适当的位置更改文件。添加的
会放置
。现在你应该可以看到结果了。不过,我会看看答案。您根本不需要
awk
。使用它,我可以将更新的文本文件重定向到另一个文件。但这是否可能在现有文件本身中更改?是的。这很有效。但我希望对现有文件本身进行更改,因为我在循环中使用它,循环根据随机生成的输入值不断更改值。如果有任何方法可以更改输入文件本身,请提供帮助。更新以覆盖现有文件太棒了!这很有效。请您解释一下set tempfile/tmp/ene.txt.[pid].[clock seconds]的用法好吗。“这会有什么用?”shim_mang看到并回答。这些文件用于创建唯一的临时文件名。创建临时文件名的更好方法是:
package require fileutil;设置tempfile[::fileutil::tempfile]
Yes。这很有效。但我希望对现有文件本身进行更改,因为我在循环中使用它,循环根据随机生成的输入值不断更改值。如果有任何方法可以更改输入文件本身,请提供帮助。更新以覆盖现有文件太棒了!这很有效。请您解释一下set tempfile/tmp/ene.txt.[pid].[clock seconds]的用法好吗。“这会有什么用?”shim_mang看到并回答。这些文件用于创建唯一的临时文件名。创建临时文件名的更好方法是:
package require fileutil;设置tempfile[::fileutil::tempfile]