这可能是微不足道的,但我在使用 awk 来实现简单目的时遇到问题,例如使用 tcl 脚本打印文件中的第一行。我在 tcl 脚本中使用了以下命令:
awk '/manager/ {print $4}' sourcefile.txt
但它给出了错误:
extra characters after close braces
源文件.txt:
ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000
我想打印包含搜索字符串的行的特定列;这里搜索的字符串是“manager”,我想要的输出是第四列,所以,所需的输出:
45000
50000
47000
awk 命令在终端中运行良好;但当我将其放入文件中然后执行该文件时显示错误。
我已经找到了解决方案。谢谢回答!
还有一个疑问,假设我将值“manager”存储在变量“var”中。我想使用该变量进行搜索:我可以使用它吗?
awk {/$var/ {print $4}} sourcefile.txt
我找不到办法。上面的命令没有给我结果。
答案1
用大括号替换单引号,所以
awk {/manager/ {print $4}} sourcefile.txt
单引号字符 (') 在 Tcl 语言中没有特殊含义。这只是一个普通的角色。在 Tcl 中,单词在空格上分割,因此任何带有空格的文字或字符串都应该被引用。有两种方法可以引用字符串。带大括号和引号。
当用大括号引用时,不执行替换。嵌入的大括号可以用反斜杠转义,但请注意反斜杠是字符串的一部分。
当用双引号引用时,将处理命令、反斜杠和变量替换。
答案2
这可以简单地在 tcl 中完成
set fi [ open "file.txt" ]
set lines [split [read $fi] "\n"]
close $fi
foreach line $lines {
if { [ regexp {^.+manager.+$} $line manager ] } {
regexp {[0-9]+$} $manager account
puts $account
}
}
或更类似于 awk
foreach line $lines {
set la [ split $line ]
if { [ lindex $la 1 ] eq {manager} } {
puts [ lindex $la 3 ]
}
}
请注意,列表索引从 0 开始,awk 的$4
' 是 tcl[lindex $la 3]