2012-04-12 18 views
1

Ich versuche, die Zeichenfolge in einer Datei basierend auf einem Trennzeichen zu teilen. Aber ich bin nicht in der Lage, es richtig zu erreichen ... Hier ist mein Code unten.Split-String auf einem Backslash ("") Trennzeichen in awk?

awk 'var=split($2,arr,'\'); {print $var}' file1.dat 

Hier ist meine Beispieldaten Jungs.

Col1 Col2 
abc 123\abc 
abcd 123\abcd 

Wunsch Ausgang:

Col1 Col2 
abc abc 
abcd abcd 
+3

Ihre Zitiert wird gebrochen, genau hinsehen, um farbige Hervorhebung. –

+0

Immer noch nicht in der Lage, es zu finden ... – Teja

+1

Sie können einfache Anführungszeichen nicht in einfache Anführungszeichen verschachteln. –

Antwort

1

Beispieldaten und Ausgang ist meine beste Vermutung auf Ihrer Anforderung

echo '1:2\\a\\b:3' | awk -F: '{ 
    n=split($2,arr,"\\") 
    # print "#dbg:n=" n 
    var=arr[3] 
    print var 
    }' 

Ausgang

b 

Rec all das split gibt die Anzahl der Felder zurück, die es geteilt hat. Sie können die Debug-Zeile auskommentieren und Sie sehen den Wert 3 zurückgegeben.

Beachten Sie auch, dass ich für meinen Test 2 '\' Zeichen für 1 zu verarbeiten hatte. Ich glaube nicht, dass Sie das in einer Datei benötigen, aber wenn das mit einer Datei nicht funktioniert, dann versuchen Sie, Ihren Daten ein zusätzliches '\' hinzuzufügen. Ich habe verschiedene Varianten der Verwendung von '\' ausprobiert, und das scheint am einfachsten zu sein. Andere sind willkommen zu kommentieren!

Ich hoffe, das hilft.

+0

Ja müssen Sie immer noch '\' entkommen, auch wenn das awk-Skript in einer separaten Datei zur Verfügung gestellt wird, anstatt geliefert in der Befehlszeile. – dubiousjim

3

Sie müssen nicht aufteilen. verwenden \\ nur als Feldtrennzeichen:

echo 'a\b\c\d' | awk -F\\ '{printf("%s,%s,%s,%s\n", $1, $2, $3, $4)}' 

OUTPUT:

a,b,c,d 
+0

'echo 'a \ b \ c \ d' | awk -F '\' '{printf ("% s,% s,% s,% s \ n", $ 1, $ 2, $ 3, $ 4)} "funktioniert auch. – gpojd

+0

@gpojd: Ja das ist ein guter Punkt. – anubhava

+0

Ich habe Ihr awk-Skript ausgeführt, aber es funktioniert nicht ... Ich bekomme, d ,, als Ausgabe. – Teja

0

Da einige der Kommentare erwähnt, haben Sie einfache Anführungszeichen verschachtelt. Wenn Sie einen Satz auf doppelte Anführungszeichen setzen, sollte das Problem behoben sein.

awk 'var=split($2,arr,"\"); {print $var}' file1.dat 

I Rohrleitung zu einem anderen awk lieber split.I zu verwenden weiß nicht, dass man besser ist als die andere, es ist nur eine Präferenz.

0

Sie müssen dem umgekehrten Schrägstrich ausweichen, auf den Sie sich aufteilen möchten. Sie können dies in Ihnen tun split mit doppelten Anführungszeichen wie folgt: "\\"

Sie können auch eine Array-Slice nehmen, um Ihren Code lesbarer zu machen (und vermeiden Sie eine andere Var definieren). Dies sollte für Sie arbeiten:

awk 'NR==1 { print } NR>=2 { split($0,array,"\\"); print $1,array[2] }' file1.dat

HTH

0
awk '{sub(/123\\/,"")}1' file 

Col1 Col2 
abc abc 
abcd abcd 
Verwandte Themen