2016-07-25 18 views
0

Ich stehe vor einem Problem, wo ich am Anfang einige Sonderzeichen in meiner Datei bekomme; ein Kinderspiel mit dem gleichen unten:Sonderzeichenentfernung 'sed'

^@<9b>200931350515,test1,910,420032400825443 
^@<9a>200931350515,test1,910,420032400825443 
^@<9d>200931746996,test2,910,420031390086807 

ich den folgenden Befehl bin mit etwas anderes als Zahlen in der ersten Spalte zu entfernen:

sed 's/^[^0-9]*//g' file.dat 

Kein Erfolg, dass auf. Die Datei wird während eines Festerxports aus Teradata erstellt. Der Prozess fügt beim Extrahieren einige Sonderzeichen hinzu.

Irgendeine Idee auf dem Befehl?

+0

fügt es immer die gleiche Anzahl von Zeichen pro Zeile hinzu? –

+2

auch wäre es gut, Hex-Ausgang für die obigen Zeilen zu erhalten (z. B. mit 'xxd') –

Antwort

2

Wenn Sie alle Nicht-ASCII-Zeichen irgendwo in einer Zeile entfernen möchten, können Sie tr verwenden.

tr -d '\000\200-\377' <file >file.new 
0

sed zu großer Kanone ist für so ein kleines Problem, Verwendung cut den Anfang jeder Zeile zu entfernen:

cut -b 2- file.dat 

Wo 2- der Bereich von Bytes ist, dass Sie behalten wollen, bin ich nicht sicher wie viele solche seltsamen Zeichen haben Sie es, so würde ich experimentieren mit 1-, 2-, 3-, 4-, 5- usw.

+0

Dank @krzyk. Ich hätte erwähnen sollen, dass die erstellte Datei riesig ist (> 500 GB). Außerdem ist die Anzahl der hinzugefügten Zeichen nicht konstant. Einige Linien haben 4, einige 6, nur 3. Also, Schnitt ist hier keine bessere Option; es ist auch nicht machbar für große Dateien. Sogar sed braucht Zeit in solchen riesigen Dateien. Zum Beispiel: Es dauerte 4 Stunden auf einer 439GB Datei, die gleiche Art von Operation. – knowone

+0

'cut' ist für solche Fälle schneller als' sed', aber yeah, nicht wenn die Anzahl der Zeichen variabel ist (im Allgemeinen, wenn Sie größere Dateien haben, möchten Sie Regexes vermeiden, wenn sie nicht benötigt werden). Andere gute Option ist "tr" Antwort von Triplee –

0

Es sieht aus wie die Anzahl der Zeichen, die entfernt werden sollen ist über die gesamte Linie konstant. Um eine feste Anzahl von Zeichen aus dem Anfang jeder Zeile zu entfernen, können Sie einfach tun

$ sed 's/^.....//' input >output 

Stellen Sie die Anzahl der Punkte, um Ihren Bedarf zu passen.

+1

Ich würde mich über einen Kommentar mit der Abstimmung unten freuen. Die Zeichen befinden sich am Anfang jeder Zeile und scheinen in jeder Zeile gleich zu sein. Das Skript "sed" in meiner Antwort entfernt Zeichen vom Anfang jeder Zeile. Gibt es ein Problem damit? – Kusalananda

+0

Ich stimme zu und fügte einen Satz hinzu. Ich hoffe es ist jetzt für jeden klar ... – hek2mgl

+0

@hek2mgl Danke für die Bearbeitung. – Kusalananda

1

Mit perl

perl -lne 'print /\d+,.*/g' 

200931350515,test1,910,420032400825443 
200931350515,test1,910,420032400825443 
200931746996,test2,910,420031390086807 

Matches nur Ziffern bis zum ersten Komma und dann alles andere.

+0

Das hat Wunder gewirkt. Vielen Dank!! – knowone