2017-08-08 20 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を指定すると、コードはawkコマンドの結果をvar old_tagに出力しようとします。 varの割り当ては、=の周りにスペースを入れずに行う必要があり、コマンドは$(..)で囲む必要があります。元のコードではバッククトであった可能性がありますが、これらは償却され、SOでの書式設定にはバッククエストが使用されます。
ご質問は、例えば、入力ファイルと答えるが、より多くの意味を成しているようだ

apple x1 
car a 
rotten apple 
tree sf 
apple x5 
car a4 
apple x3 
私は old_tag切り替え

new_tag、のような仮定inputlinesを説明しようとする方が簡単だったでしょう。

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 

としてAppleと行に格納されているx1 x5 x3単語を見つけます配列aとランダムにこれらの3つのうちの1つがnew_tagに割り当てられます。

関連する問題