2013-07-24 239 views
1

我需要在Tcl腳本中使用awk命令。我有一個像下面這樣的文件。我們稱之爲giri.txtawk中的Tcl變量(在Tcl中使用awk)

1 what 
2 Why 
3 When 
4 who 

我寫了下面的代碼,以爲它會打印這樣的:

what did 
why did 
when did 
who did 

set a did 
exec cat giri.txt | awk {{ print $2 " " $a }} 

但它打印這樣的:

what what 
why why 
when when 
who who 

誰能解釋爲什麼這樣打印?任何人都可以提出一種在awk中使用Tcl變量的方法嗎?

回答

1

你或許可以解決一切TCL,而不調用awk的,但如果你真的想這樣做:

set a did 
exec awk "{print \$2, a}" a=$a < giri.txt 

如果您有關於如何命令將擴大通過回聲更換Exec和檢查結果懷疑

用可重複使用的

set a "did" 
set stream [open "giri.txt"] 
while {[gets $stream line] >= 0} { 
    puts "$line $a" 
} 
close $stream 

更妙的是:

echo awk "{print \$2, a}" a=$a 
+0

如果我們在tcl裏面使用awk,shell是否和awk代碼一樣工作?或者它是awk的tcl版本? –

+0

如果我想打印$ a和$ 2沒有空格,那麼'exec'創建一個新進程 –

+0

我該怎麼辦? –

0

做沒有AWK程序:

proc forEachLine {file args} { 
    set stream [open $file] 
    while {[gets $stream line] >= 0} { 
    {*}$args $line 
    } 
    close $stream 
} 

set a "did" 
forEachLine "giri.txt" apply {{line} { 
    global a 
    puts "$line $a" 
}} 
+0

第一個代碼,你給出的只是逐行閱讀文件並與$ a一起打印。它不選擇列。要使用類似於awk的操作,我們需要像set字段[regexp -all -inline {\ S +} $ line]。用awk commad,我們可以做到這兩件事嗎?它是否具有一些性能上的優勢,如果我們在Tcl中擁有自我 –

+0

@GIRIMURALI更少的代碼行並不需要意味着更少的執行時間,您將不得不測試性能差異。如果性能非常重要,可以考慮使用C.我可以想到通過調用awk還有許多其他缺點:腳本將使用兩個進程而不是一個進程,這對於進程數量有限的系統來說並不合適。調試兩個進程將會很困難。任何維護代碼的人都需要知道awk。在不同的系統上可能有不同的awk版本,有時根本就沒有awk。 – potrzebie