Donnerstag, Februar 27, 2020

Awk reverse beiden Zeilen und Worten

Ich bin neue Programmiersprachen und Zeug
so habe ich eine Rückseite mit awk alle Linien und auch alle die Wörter in die Zeilen aus einer Datei und drucken Sie Sie aus.

„File1“ auf Rückseite:

aa bb cc

foo tun, als

Und die Ausgabe drucken von „File1“ sollten dies sein:

wie foo

cc bb aa

Habe ich versucht, dieses für-Wort rückwärts in jeder Zeile:

for (i=NF; i>1; i--) printf("%s ",$i); printf("%s\n",$1)

aber wenn ich drucken möchte, der umgekehrten Zeilen habe ich, um dies zu tun

{a[NR]=$0
}END{for(i=NR; i; i--) print a[i]}

Ich muss arbeiten mit zwei Dateien mit diesem Befehl im terminal:

awk -f commandFile FileToBePrinted

Das problem ist, ich bin beginer in all das, und ich weiß nicht, wie zu kombinieren die zwei.
Danke!

  • +1 für gut präsentiert, Frage (die erste Zeit auch!). Gute Formatierung, Beispiel für die Eingabe, Ausgabe UND code, der nicht funktioniert! Gute show und keep posting!
InformationsquelleAutor Vodaldrien | 2012-03-27

3 Kommentare

  1. 3

    Kev ‚ s Lösung sieht eine Umkehrung der text in jedem Wort. Sie Beispiel für die Ausgabe nicht zeigen, aber seine wichtigste Punkt ist eine Funktion verwenden.

    Haben Sie den code, den Sie benötigen, brauchen Sie nur neu zu ordnen es ein wenig.

    cat file1
    aa bb cc
    foo do as
    
    cat commandFile
    
    function reverse( line ) {
      n=split(line, tmpLine)
      for (j=n; j>0; j--) {
        printf("%s ",tmpLine[j] )
      }
    
    }
    # main loop
    { a[NR]=$0 }
    
    # print reversed array
    END{ for(i=NR; i>0; i--) printf( "%s\n",  reverse(a[i]) ) }

    Läuft

     awk -f commandFile file1

    Ausgabe

    as do foo
    cc bb aa

    Gab es ein paar kleinere änderungen, die ich gemacht habe, mit n=split(line, tmpLine) ... print tmpLine[j] ist, ist eine Allgemeine Methode zum Parsen einer Zeile der Eingabe in einer Funktion drucken Sie es aus. Ich glaube nicht, dass die $1 vars Umfang von einem übergebenen Wert aus einem array (Ihre a[i] – Wert), also habe ich es aufgeteilt..tmpLine[j]. Ich fand auch, dass die ‚ich‘ – variable aus Abschnitt am ENDE wurde gehalten im Rahmen der Funktion reverse, so dass ich geändert, dass j keine Verwechslungen der situation.


    Musste ich ein paar Dinge heraus, so unten ist der debug-version, die ich verwendet.

    Wenn du gehst, um Zugang zu glotzen, dann wirst du gut tun, zu lernen, wie Sie den debugger verwenden, die verfügbar ist. Wenn Sie mit awk/gawk/nawk auf Systemen ohne einen debugger, dann ist das eine Methode für das Verständnis, was Los ist in Ihrem code. Wenn Sie umleiten Ihre Programme die Ausgabe in eine Datei oder pipe, UND wenn Sie system unterstützt „/dev/stderr“ – notation, die Sie drucken konnte, die debug-Zeilen, d.h.

     #dbg print "#dbg0:line=" line > "/dev/stderr"

    Einige Systeme haben andere Bezeichnungen für den Zugriff auf stderr, so dass, wenn Sie tun so viel, es lohnt sich, um herauszufinden, was verfügbar ist.

    cat commandFile.debug
    function reverse( line ) {
      n=split(line, tmpLine)
      #dbg print "#dbg0:line=" line
      #dbg print "#dbg1:n=" n "\tj=" j "\ttmpLine[j]=" tmpLine[j]
      for (j=n; j>0; j--) {
        #dbg print "#dbg2:n=" n "\tj=" j "\ttempLine[j]=" tmpLine[j]
        printf("%s ",tmpLine[j] )
      }
    
    }
    # main loop
    { a[NR]=$0 }
    
    # print reversed array
    #dbg END{ print "AT END";  for(i=NR; i>0; i--) printf( "#dbg4:i=%d\t%s\n%s\n", i, a[i] , reverse(a[i])
     ) }
    END{ for(i=NR; i>0; i--) printf( "%s\n",  reverse(a[i]) ) }

    Ich hoffe, das hilft.

  2. 2
    awk '
    {
        x=reverse($0) (x?"\n":"") x
    }
    
    END{
        print x
    }
    
    function reverse(s,    p)
    {
        for(i=length(s);i>0;i--)
            p=p substr(s,i,1)
        return p
    }' File1
  3. 2

    verwenden tac zum umkehren der Zeilen der Datei, dann awk-eine Umkehrung der Wörter.

    tac filename | awk '{for (i=NF; i>1; i--) printf("%s ",$i); printf("%s\n",$1)}'

    Könnte man auch so etwas wie Perl, die list-Umkehr-Funktionen built-in:

    tac filename | perl -lane 'print join(" ", reverse(@F))'

Kostenlose Online-Tests