(g)awk



  • kurze Frage zur genannten Sprache:

    gibt es irgeneine Möglichkeit den aktuellen field seperator rauszufinden.

    Beispiel:

    Angenommen ich wollte in einem Text jedes Wort xxxy in yyyx ersetzen......den Text aber sonst nicht ändern.....also wenn zwischen zwei fields ein oder fünf Leerzeichen stehen oder ein tab, soll das auch so bleiben.
    (dann sollte ich wissen ob ein tab oder ein leerzeichen und wie viel dazwischen waren).

    Geht das überhaupt?
    i.A. haut awk ja immer den Output aud stdout.....kann ich direkt im gerade geöffneten File manipulieren.
    Alos auf obiges Bsp. bezogen...könnte ich xxxy direkt im File ändern oder muss ich alles erst in ein anderes File schreiben und dann umbenennen o.ä.?



  • Tab rausfiltern geht so:

    gawk -F'\t' '{print $1}' test.txt
    

    Allerdings glaub ich, deine Frage nicht wirklich zu verstehen. Willst du das Wort jetzt von Hand ersetzen? Wenn nicht, brauchst du das ja eigentlich nicht wissen, denn mit Regular Expression ersetzt du dann eben nur das Wort, alle anderen Zeichen, ob TAB oder Leerzeichen, ob davor oder dahinter, bleiben da wo sie vorher auch waren.

    Ob du wirklich in einem geöffnete File rumschreiben willst, wage ich zu bezweifeln. Denn RegExp sind recht fehleranfällig (einfach mal nen $ oder nen / irgendwo vergessen, und die Folgen können dramatisch sein). Wenn das dann das Originalfile war, hast du ein Problem.



  • Ich will nicht den Field Seperator setzen (also das mit -F bringt mir nicht viel).

    Ich will wenn ich beispielsweise ein in einem File stehen hab:

    Hallo______World!!

    (_ sei ein Leerzeichen)
    und jetzt Hallo in Hello ändern will, dass dann:

    Hello______World!!

    und nicht:

    Hello_World!!

    drinsteht.

    Meinst du dass ich die RegExp komplett über den String aus $0 drüber laufen lassen soll?
    Gut dass das geht.

    Aber wenn ich Beispilesweise so was mache:

    {
       $1 = "Hello";
       printf "%s", $0;
    }
    

    Dann ist die Formatierung futsch.

    Also das heisst ich zieh mir den String aus $0....mach meine Ersetzungssachen mit Regexp oder den Stringmanipulatorfkt. und schreib den String in ein anderes File oder stdout oder etc.....dachte awk hätte da irgendwas extra tolles .... das geht ja mit jeder anderen Skriptsprache oder C genauso.

    In dem geöffneten File wollte ich nur rumschreiben, weil ich so nen art Query replace (wie im emacs) haben wollte. Also rufe Prog mit searchstr und replacestr und Files auf....bei jedem Vorkommen....gib File, Zeilennummer und Zeile aus .... markiere dabei das Wort (kann ja öfter in einer Zeile vorkommen) und frage ob es geändert werden soll. Das hätte ich halt glein in den File gemacht.....

    Ich mein ich würde ja zum Testen meiner regexp nicht gleich die sensibelsten daten nehmen und das programm hätte ja noch überschaubare ausmasse.

    Noch ne Frage:

    Kann ich in den Mustern zum Suchen der bestimmten Zeilen ....

    /Muster/{...}
    

    ... irgendwie Variablen benutzen die ich im BEGIN-block initialisiert hab?



  • Der Fiedseperator steht beim awk in der build-in Variable FS (RTFM).
    Wenn du ihn dazu missbrauchen willst, um z. B. "a" in "e" umzuwandeln,
    dann geht das mit:

    BEGIN { FS ="a"; OFS ="e";} { $1=$1;print $0 }
    


  • mein letzter beitrag erste Zeile:

    Ich will nicht den Field Seperator setzen (also das mit -F bringt mir nicht viel).

    trotzdem danke für deine bemühungen.


Anmelden zum Antworten