Übersetzen Sie

Translate to EnglishÜbersetzen Sie zum Deutsch/GermanΜεταφράστε στα ελληνικά/GreekПереведите к русскому/RussianOversetter til Norsk/NorwegianÖversätta till Svensk/Swedishहिनà¥à¤¦à¥€ अनà¥à¤µà¤¾à¤¦ करने के लिà¤/Hindi
Tradueix al català/CatalanTulkot uz latviešu/LatvianPreložiť do slovenčiny/SlovakVertaal aan het Nederlands/Dutchترجمة الى العربية/ArabicTraduzca al Español/SpanishTraduisez au Français/French
Traduca ad Italiano/ItalianTraduza ao Português/Portuguese日本語に翻訳しなさい /Japanese한국어에게 번역하십시오/Korean中文翻译/Chinese Simplified中文翻译/Chinese TraditionalПереклад на українську/Ukrainian

Vereinigende Reihen der Art-KSH93

Beide ksh93 und heftiger Schlag V4 stützen vereinigende Reihen. Jedoch stellen keine jeden eingebauten Mechanismus zu den vereinigenden Reihen der Art zur Verfügung. Vor kurzem stieß ich auf das folgende Problem zufällig. Eine Liste von IP address wie das folgende gegeben:

192.168.1.10
192.168.1.10
192.168.1.10
192.168.1.11
192.168.1.15
192.168.1.15
192.168.1.20
192.168.1.22


wie ein Erzeugnis ein Gruppe durch den zusammenfassenden Bericht kann, der dem folgenden ähnlich ist:

192.168.1.10 : 3
192.168.1.15 : 2
192.168.1.20 : 1
192.168.1.11 : 1
192.168.1.22 : 1


Der Report zählt die Vorkommen jedes IP address in der Eingangsliste und gibt den Zählimpuls in absteigender Folge aus. Anmerkung, die sie nicht versucht, die IP address zu sortieren, in denen der Zählimpuls der selbe ist.

Mit regelmäßigen non-associative Reihen konnten Sie eine einfache Austauschsortierung verwenden, um die Feldelemente zu sortieren, aber diese Annäherung arbeitet nicht für vereinigende Reihen. Warum nicht? Denken Sie an sie! Die Antwort liegt in der Tatsache, dass wir ein vereinigendes Feldelement nicht einem anderen vereinigenden Feldelement zuweisen können, wie wir mit regelmäßigen Reihen können.

Ist hier die Lösung, die ich mit aufkam:

#!/bin/ksh93

typeset -A count

# create an associative array
while read ip
do
    (( count[$ip]++ ))
done < infile

# sort print the associative array
while (( 1 ))
do
   [[ ${#count[@]} == 0 ]] && break;
   k=(${!count[@]})
   for j in ${!count[@]}
   do
      (( ${count[$j]} > ${count[$k]} )) && k=$j
   done
   echo "$k : ${count[$k]}"
   unset count[$k]
done


Sie verwendet einen Teilnehmerreihenzählimpuls, um die Zahl Vorkommen von jedem der IP address zu zählen. Nach dem Ablesen der infile Eingangsakte, ist der Inhalt der vereinigenden Reihe, wie folgt:

192.168.1.15 : 2
192.168.1.20 : 1
192.168.1.10 : 3
192.168.1.11 : 1
192.168.1.22 : 1


wenn Sie dieses für selbst sehen möchten, fügen Sie den folgenden Code dem Index gerade über der Artdruckprogrammanmerkung hinzu:

echo "Unsorted"
for i in ${!count[@]}
do
    echo "$i : ${count[$i]}"
done
echo "Sorted"


Jetzt wendend an das Artdruckprogramm, ist die erste Sache, die Sie beachten sollten, dass sie während Schleife ein endloses ist. Das Konstruieren ((1)) wird benutzt, um die Endlosschleife zu verursachen. Während die Zahl Elementen im vereinigenden Reihenzählimpuls größer als null ist, fährt diese Schleife fort durchzuführen. Die Schleife wird über eine Bruchaussage wenn die Zahl Elementen in den vereinigenden Reihenreichweiten null existiert. Das Konstruieren $ {#count [@]} bringt die Zahl Elementen in der vereinigenden Reihe zurück. Dann wählt das Oberteil das erste Einzelteil in der vereinigenden Reihe vor. Sie können $count [0] nicht verwenden um dies zu tun, während dieses Konstruieren nur für regelmäßige Reihen und nicht für vereinigende Reihen arbeitet. Stattdessen müssen Sie verwenden ($ {! Zählimpuls [@]}) zum des ersten Wertes von der Liste der vereinigenden Reihenschlüssel dem variablen K. zuzuweisen. Wenn Sie k=$ verwenden {! Zählimpuls [@]} weist es eine Liste aller vereinigenden Reihenschlüssel K. zum Beispiel zu

k=${!count[@]}
echo $k
k=(${!count[@]})
echo $k


Ausgänge

192.168.1.15 192.168.1.20 192.168.1.10 192.168.1.11 192.168.1.22
192.168.1.15


Der Rest des thesort Druckprogramms sollte einfach sein zu verstehen. Er findet einfach den größten Wert und gibt das IP address und seinen Wert aus. Er dann entfernt dass bestimmtes IP address von der vereinigenden Reihe unter Verwendung des unset Befehls und wiederholt die Schleife, bis der vereinigende Reihenzählimpuls 0 ist.
 

Lassen Sie eine Anmerkung