staging.inyokaproject.org

awk – terminalbefehl vs scriptaufruf liefern unterschiedliche Ergebnisse

Status: Gelöst | Ubuntu-Version: Ubuntu 22.04 (Jammy Jellyfish)
Antworten |

ernie-1

Avatar von ernie-1

Anmeldungsdatum:
30. Dezember 2012

Beiträge: 87

Hallo,

Ich habe hier ein unterschiedliches Verhalten, das ich mir nicht erklären kann:

Im Terminal gibt der Befehl

echo "Komma,_line_Komma,_line__abs_Semikolon;_line_Semikolon;_line__abs_ENDE" | awk '
{
    gsub(/,(_line__abs_|_line_)/, ", ");  # Ersetze `,_line__abs_` oder `,_line_` durch `, `
    gsub(/;(_line__abs_|_line_)/, "; ");  # Ersetze `;_line__abs_` oder `;_line_` durch `; `
    print
}'

das erwartete Ergebnis

Komma, Komma, Semikolon; Semikolon; ENDE

Wenn ich die Befehle aber als scriptdatei 'script.awk' ausführen lasse:

awk -f script.awk input.txt > 2.txt

Inhalt 'input.txt':

Komma,_line_Komma,_line__abs_Semikolon;_line_Semikolon;_line__abs_ENDE

Inhalt 'script.awk':

# script.awk
{
    gsub(/,(_line__abs_|_line_)/, ", ");  # Ersetze `,_line__abs_` oder `,_line_` durch `, `
    gsub(/;(_line__abs_|_line_)/, "; ");  # Ersetze `;_line__abs_` oder `;_line_` durch `; `
    print
}

dann erhalte ich folgendes Ergebnis:

Komma, Komma._ Semikolon; Semikolon;_ ENDE

Wie kann es zu so einem unterschiedlichen Verhalten zwischen output Terminalbefehl und output Dateiaufruf kommen? Noch wichtiger: Wie löse ich das Problem, dass der scriptdateiaufruf ein falsches Ergebnis liefert?

Schon mal vielen Dank für Ideen und Antworten

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

Möglicherweise erfährt das Zeichen ";" durch print eine Sonderbehandlung, weil es innerhalb der Sprache AWK ja der Operator zur Verkettung von Befehlen ist.

Versuche mal, in den Daten dieses Zeichen durch ein anderes, z.B. "§" zu ersetzen. Liefern dann die beiden Methoden identische Ergebnisse?

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Ich kann das Problem nicht nachvollziehen, bei mir führen beide Wege zum gleichen Ergebnis:

bj@s8n:~$ cat test.txt
Komma,_line_Komma,_line__abs_Semikolon;_line_Semikolon;_line__abs_ENDE
bj@s8n:~$ < test.txt awk '                            
{
    gsub(/,(_line__abs_|_line_)/, ", ");  # Ersetze `,_line__abs_` oder `,_line_` durch `, `
    gsub(/;(_line__abs_|_line_)/, "; ");  # Ersetze `;_line__abs_` oder `;_line_` durch `; `
    print
}'
Komma, Komma, Semikolon; Semikolon; ENDE
bj@s8n:~$ cat test.awk
{
    gsub(/,(_line__abs_|_line_)/, ", ");  # Ersetze `,_line__abs_` oder `,_line_` durch `, `
    gsub(/;(_line__abs_|_line_)/, "; ");  # Ersetze `;_line__abs_` oder `;_line_` durch `; `
    print
}
bj@s8n:~$ < test.txt awk -f test.awk
Komma, Komma, Semikolon; Semikolon; ENDE

ernie-1

(Themenstarter)
Avatar von ernie-1

Anmeldungsdatum:
30. Dezember 2012

Beiträge: 87

Marc_BlackJack_Rintsch schrieb:

Ich kann das Problem nicht nachvollziehen, bei mir führen beide Wege zum gleichen Ergebnis:

Danke für diesen entscheidenden Hinweis.

Mein Fehler: im script 'test.awk' befanden sich weitere Anweisungen, die nicht richtig auskommentiert waren und den String in 'input txt' verändert haben.

Tut mir leid, ich denke (offensichtlich) noch nicht wie ein Programmierer.

Antworten |