2017-08-08 155 views
0

我是Bash腳本編寫新手。我正在努力理解這個特定的代碼行。請幫忙。bash腳本awk

old_tag = awk -v search="$new_tag" -F" " '$1==search { a[count] = $2; count++; } END { srand();print a[int(rand()*(count-1))+1] }' $tag_dir/$file 
    [ -z "$new_tag" ] && break 
+0

請更具體。 Awk是一種自己的語言。我們並沒有取代你的學習能力。你不明白哪部分? – Jankapunkt

回答

0

該代碼似乎不正確。使用old_tag = awk代碼會嘗試輸出var old_tag中的awk命令的結果。應該在=周圍沒有空格的情況下分配var,並且命令應該包含在$(..)中。它可能是原始代碼中的反向代碼,這些都是折舊的,反向代碼用於SO中的格式化。
你的問題本來就容易用一個例子來inputfile中回答,而是試圖解釋假設inputlines像

apple x1 
car a 
rotten apple 
tree sf 
apple x5 
car a4 
apple x3 

我切換old_tagnew_tag,似乎更有意義。

new_tag=$(awk -v search="$old_tag" -F" " ' 
    $1==search { a[count] = $2; count++; } 
    END { srand(); print a[int(rand()*(count-1))+1] } 
    ' $tag_dir/$file) 
[ -z "$new_tag" ] && break 

這鱈魚試圖以取代在$tag_dir/$file搜索舊標籤找到一個新的標籤。當標籤出現多次時,請隨機選取其中一行。

的代碼更詳細地解釋:

# assign output to variable new_tag 
new_tag=$(..) 
# use awk program 
awk .. 
# Assign the valuo of old_tag to a variable "search" that can be used in awk 
-v search="$old_tag" 
# Different fields seperated by spaces 
-F" " 
# The awk programming lines 
' .. ' 
# Check first field of line with the variable search 
$1==search { .. } 
# When true, store second field of line in array and increment index 
a[count] = $2; count++; 
# Additional comands after processing everything 
END {..} 
# Print random index from array 
srand(); print a[int(rand()*(count-1))+1] 
# Use file as input for awk 
$tag_dir/$file 
# Stop when no new_tag has been found 
[ -z "$new_tag" ] && break 
# I would have preferred the syntax 
test -z "${new_tag}" && break 

隨着樣本輸入和old_tag="apple",代碼會發現蘋果線作爲第一字

apple x1 
apple x5 
apple x3 

詞語x1 x5 x3被存儲在數組a,並隨機將這3箇中的一個分配到new_tag