awk Zeichenunterschiede bei der Verwendung von if


1

Ich habe eine Eingabedatei mit dieser Zeile (Benutzerdaten / Spalten entfernt) und einige tausend mehr. XCE ist ein nicht konvertierter Hex-Wert aus der Client-Datei.

412640  xCE

Wenn ich es durch diesen awk Befehl starte:

awk -F'\t' '{if ($1 == "412640" ) print $1 "\t" $2}' TEST.txt > test1.txt

Die Ausgabe in test1.txt hat xCE in Î konvertiert, was auch passieren soll.

Wenn ich die gesamte Datei ohne if ausführe, lautet der folgende Befehl:

awk -F'\t' '{print $1 "\t" $2}' TEST.txt > test2.txt

Die Ausgabe in test2.txt enthält noch xCE, und als ich es versuchte:

awk -F'\t' '{if ($1 == $1 )print $1 "\t" $2}' TEST.txt > test2.txt

Die Ausgabe in Test2 enthält noch xCE.

Irgendwelche Ratschläge, wie man immer die konvertierte Ausgabe erhält?

Ich benutze:: GNU Awk 3.1.7 Meine Codepage ist UTF-8 Auf Red Hat 6.7

BEARBEITEN: Nach ein paar weiteren Unit-Tests der beiden Befehle 'good' / 'bad' awk kann ich die 'bad'-Ausgabe nicht immer replizieren. Je größer die Gesamtanzahl der Zeilen ist, desto unwahrscheinlicher ist es, die Hex-Werte zu konvertieren, aber nicht in 100% der Fälle. Ich versuche jetzt, die Größe des Puffers für awk zu steuern, unter der Annahme, dass es mit dem Schreiben direkt vom Puffer zur Ausgabe im Gegensatz zum Schreiben in interne temporäre Dateien zusammenhängt, wenn der Puffer für andere Dinge benötigt wird.


Ich habe Ihren Befehl if ($ 1 == "412640") für die angegebene Zeile ausgeführt. Es gibt aus nichts . Fügen Sie einen Link zu einer Testdatei mit einigen Zeilen darin, dem System, auf dem Sie ausgeführt werden, und der Version von Awk hinzu. GNU Awk 4.0.1.
Hastur

Hauster, ich vermute, Sie haben Leerzeichen anstelle eines Tabulators zwischen den beiden Spalten. Gibt es eine Möglichkeit, Dateien zum Superuser hochzuladen?
mike ray

2
Wie ist print $1 "\t" $2 soll konvertieren xCE zu Î?
Steven

Ich habe die Frage aktualisiert, um die awk / linux / codepage einzuschließen und zu erklären, dass xCE ein nicht verdecktes Zeichen aus der Client-Datei ist.
mike ray

Ich habe versucht, ein Beispiel über Google Docs hochzuladen, aber es war weiterhin hilfreich und hat den schlechten Charakter für mich konvertiert ...
mike ray

Antworten:


1

Probieren Sie etwas aus

 awk '{ printf("%c \n" ,strtonum("0x" substr($2,2)))}' TEST.txt 

natürlich ändern Sie den Ausdruck printf nach Ihren Wünschen und fügen Sie den hinzu if das $2 ...


Das obige Beispiel ist nur ein Beispiel, bei dem alle Clientdaten entfernt wurden. Ich kann nicht vorhersagen, wo die fehlerhaften Hexwerte angezeigt werden, und Clientdaten können Millionen von Zeilen umfassen. Wenn ich Ihren Vorschlag richtig verstehe, muss ich jeden einzelnen Buchstaben strtonumieren.
mike ray

@mikeray: Sorry das war ich wirklich in Eile ; der vorgeschlagene war nur ein Hinweis auf die aktuelle Situation (als Sie sagten "Jeder Rat, wie es geht immer die konvertierte Ausgabe erhalten? " ). Übrigens, wenn die Eingabe nicht immer so ist, ist es ein anderer Fall. IMHO solltest du versuchen Korrigieren Sie die Eingabe, wenn die Clients sie erstellen . So können Sie einmal die vergangene Situation beheben und mit einem Standard fortfahren Arbeitsablauf . Da wir in meiner Nachbarschaft anfangen, klein zu sein Feen Ich fürchte, Sie werden sich weiterhin mit einem nicht einheitlichen Input befassen. :-) Also das muss man alles scannen ... nutzen if unnötige Operationen zu überspringen ...
Hastur
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.