it-swarm.com.de

Wie verwende ich sort in einem awk print Befehl?

Ich habe ein paar Befehle in einem awk-Skript, das ich schreibe:

print "Here are some players and their numbers, sorted by last name"
if(sum[x] > 500) {print x, $2}

Welche Ausgänge:

Here are some players and their numbers, sorted by last name
Lebron James 23
Kevin Durant 35
Kobe Bryant 24
Blake Griffin 32
Dikembe Mutumbo 55

Wie kann ich den Befehl sortin meinem awk-Skript verwenden, um NUR die Spieler und ihre Nummern zu sortieren?

8
KMoy

sie können Ihrem Befehl | sort -k2 hinzufügen. Dies wird alphabetisch nach der zweiten Spalte sortiert.

Beispiel:

$ echo "Lebron James 23
Kevin Durant 35
Kobe Bryant 24
Blake Griffin 32
Dikembe Mutumbo 55" | sort -k2

ergebnisse in

Kobe Bryant 24
Kevin Durant 35
Blake Griffin 32
Lebron James 23
Dikembe Mutumbo 55
11
Wayne_Yux

Obwohl ich es nicht empfehlen würde (angesichts der relativ einfachen Weiterleitung des Ergebnisses durch einen externen sort -Befehl), können Sie dies zumindest mit neueren Versionen von GNU awk (mindestens 4.0 IIRC) tun. , wie unter Sortieren von Array-Werten und -Indizes mit gawk beschrieben

So können Sie es implementieren, vorausgesetzt, Sie haben die Daten in einem assoziativen Array, in dem der Index Firstname Lastname lautet. Zuerst müssen Sie eine benutzerdefinierte Vergleichsfunktion definieren, die den Index aufteilt und zuerst mit Lastname und dann (als Verbindungsunterbrecher) mit Firstname vergleicht, z.

function mycmp(ia, va, ib, vb, sa, sb) {
  if(split(toupper(ia), sa) && split(toupper(ib), sb)) {
    if(sa[2] < sb[2]) return -1;
    else if (sa[2] > sb[2]) return 1;
    else {
      # compare first names
      if(sa[1] < sb[1]) return -1;
      else if (sa[1] > sb[1]) return 1;
      else return 0;
    }
  }
  else return 0;
}

Jetzt können Sie die Sortiermethode PROCINFO["sorted_in"] für Arrays verwenden, die in den Kommentaren von @zwets erwähnt wird

PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];

Etwas zusammensetzen

#!/usr/bin/gawk -f

function mycmp(ia, va, ib, vb, sa, sb) {
  if(split(toupper(ia), sa) && split(toupper(ib), sb)) {
    if(sa[2] < sb[2]) return -1;
    else if (sa[2] > sb[2]) return 1;
    else {
      # compare first names
      if(sa[1] < sb[1]) return -1;
      else if (sa[1] > sb[1]) return 1;
      else return 0;
    }
  }
  else return 0;
}

{
  a[$1" "$2] = $3;
}

END {
  PROCINFO["sorted_in"] = "mycmp";
  for(i in a) print i, a[i];
}

Testen:

$ ./namesort.awk yourfile
Kobe Bryant 24
Kevin Durant 35
Blake Griffin 32
Lebron James 23
Dikembe Mutumbo 55

In kleineren oder älteren Versionen von awk empfiehlt es sich, die mit Lastname Firstname indizierten Daten zu speichern, stattdessen mit dem herkömmlichen asorti zu sortieren und dann die Felder der Indizes beim Durchlaufen des Arrays zu teilen und auszutauschen um es zu drucken:

awk '
  {a[$2" "$1]=$3} 
  END {
    n=asorti(a,b); for (i=1;i<=n;i++) {split(b[i],s); print s[2], s[1], a[b[i]]}
}' yourfile
8
steeldriver

Um sort nur durch das durch Leerzeichen getrennte zweite Feld zu aktivieren, verwenden Sie die Taste -k2,2:

... | sort -k2,2

standardmäßig sortiert sort lexikografisch.

Beachten Sie, dass, wenn Sie das letzte Feld für den Sortierschlüssel nicht erwähnen, dh wenn Sie nur -k2 verwenden, Sie möglicherweise nicht das gewünschte Ergebnis erhalten, da dies sort gemäß allen Feldern) ergibt ab Sekunde.

Überprüfen Sie auch man sort.

5
heemayl

so sortieren Sie Ihre zu druckenden Daten:

angenommen, Sie möchten das zweite Feld (mit Leerzeichen getrennt) drucken.

awk '{print $ 2}' data.txt | sort

z.B:

---Terminal----

$cat>data.txt

1 Kedar 20

2 Amit 30

3 Rahul 21

^ C

$awk '{print $2}' |sort

Amit

Kedar

Rahul


Wenn Sie die gesamte Datei data.txt drucken möchten, diese jedoch nach Spalte 2 sortiert ist

dann

-----Terminal-----

$awk '{print}'|sort -k2

2 Amit 30

1 Kedar 20

3 Rahul 21

Verwenden Sie diese Logik (en) in Ihrer Anforderung.

Sie können man sort für interessantere Funktionen verwenden. !!!

Viel Spaß mit UNIX/LINUX !!

1

Versuchen

awk -f myscript.awk | sort -k2

Wobei myscript.awk reine awk-Befehle enthält.

Wenn es sich bei Ihrem tatsächlichen Skript um ein Shell-Skript handelt, haben Sie mehrere Optionen, einschließlich

  • Rohrausgabe durch Sortieren. ./myscript.bash | sort -k2
  • Schreiben Sie den Code als Funktion innerhalb des Skripts um
    Anstatt von

    $ cat t1
    #!/bin/bash
    for i in 2 4 3 1 5;
    do
      echo $i
    done
    
    $ ./t1
    2
    4
    3
    1
    5
    

    Machen

    $ cat t2
    #!/bin/bash
    function foo {
      for i in 2 4 3 1 5;
      do
        echo $i
      done
    }
    foo | sort
    
    $ ./t2
    1
    2
    3
    4
    5
    

Beachten Sie jedoch, dass Sie die Sortierung auch auf die do ... done-Struktur anwenden können, anstatt eine Funktion zu erstellen.

    do
       echo $i
    done | sort
1
RedGrittyBrick

was ist mit unten:

 awk 'BEGIN{str="1\n2\n3\n4"; system("echo -e \""str"\" | sort -r")}'

es funktioniert, wenn ich getestet habe.

0
Fei Wang