これはマイナーなことですが、tclスクリプトを使用してファイルの最初の行を印刷するなど、単純な目的でawkを使用するのに問題があります。 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」で、目的の出力は4列目なので、目的の出力は次のようになります。
45000
50000
47000
awkコマンドは端末でうまく実行されますが、ファイルに入れてファイルを実行するとエラーが表示されます。
解決策が見つかりました。答えてくれてありがとう!
もう1つ疑わしい点は、「var」変数に「manager」値を格納しているとします。検索にこの変数を使用したいです。使えますか?
awk {/$var/ {print $4}} sourcefile.txt
方法が見つかりません。上記のコマンドは私に結果を与えません。
答え1
一重引用符を中括弧で置き換えます。
awk {/manager/ {print $4}} sourcefile.txt
一重引用符文字( ')はTcl言語では特別な意味を持ちません。これはただの普通のキャラクターです。 Tclでは、単語はスペースに分割されるため、スペースを含むリテラルまたは文字列を引用する必要があります。文字列を引用する方法は2つあります。中かっこと引用符があります。
中かっこで引用すると置換は行われません。含まれる中括弧はバックスラッシュを使用してエスケープできますが、バックスラッシュは文字列の一部であることに注意してください。
二重引用符で囲むと、コマンド、バックスラッシュ、および変数置換が処理されます。
答え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]