在TCL中使用AWK仅更改文本文件的一部分
我只想使用AWK更改文本文件的特定值,并保留其余的值 输入文件ene.txt: 我需要更改TCL提供的变量的值 my_code.tcl: drain.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将打印当前行 上
这应该适合您:
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]