2017-08-08 14 views
0

Ich bin neu in Bash-Skripten. Ich habe Mühe, diese spezielle Codezeile zu verstehen. Bitte helfen Sie.Bash-Skript 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

Bitte präzisieren. Awk ist eine eigene Sprache. Wir ersetzen nicht Ihre Lernfähigkeit. Welchen Teil davon verstehst du nicht? – Jankapunkt

Antwort

0

Der Code scheint falsch zu sein. Mit old_tag = awk versucht der Code die Ergebnisse des awk-Befehls im var old_tag auszugeben. Eine Zuweisung einer Variablen sollte ohne Leerzeichen um die = erfolgen, und der Befehl sollte in $(..) enthalten sein. Es könnte sich um Backtics im ursprünglichen Code handeln, diese werden abgeschrieben und Backtics werden für die Formatierung in SO verwendet.
Ihre Frage wäre einfacher gewesen, mit einem Beispiel Eingabedatei zu beantworten, aber versuchen inputlines wie

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

Ich wechselte old_tag und new_tag, die mehr Sinn zu machen scheint zu erklären, übernehmen.

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 

Dieser cod versucht, einen neuen Tag zu ersetzen, indem Sie zu finden, den alten Tag in $tag_dir/$file suchen. Wenn das Tag mehr als einmal auftritt, nehmen Sie eine der Zeilen zufällig.

Der Code näher erläutert:

# 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 

Mit dem Probeneingang und old_tag="apple", wird der Code die Zeilen mit Apfel als erstes Wort

apple x1 
apple x5 
apple x3 

Die Worte x1 x5 x3 werden finden gespeichert in Array a und zufällig einer dieser 3 ist new_tag zugeordnet.