2017-02-22 6 views
3

Ich habe wenige Spalten in einer Datei, in der die zweite Spalte ":" Trennzeichen hat und ich möchte die erste, dritte und vierte Zeichenkette in der zweiten Spalte entfernen und die zweite Zeichenkette verlassen in dieser Spalte. Aber ich habe den normalen Begrenzerraum, also habe ich keine Ahnung.awk: Zeichenketten durch spezifisches Trennzeichen entfernen

input: 

--- 22:16050075:A:G 16050075 A G 
--- 22:16050115:G:A 16050115 G A 
--- 22:16050213:C:T 16050213 C T 
--- 22:16050319:C:T 16050319 C T 
--- 22:16050527:C:A 16050527 C A 

desired output: 

--- 22 16050075 16050075 A G 
--- 22 16050115 16050115 G A 
--- 22 16050213 16050213 C T 
--- 22 16050319 16050319 C T 
--- 22 16050527 16050527 C A 

Wrong: 
cat df.txt | awk -F: '{print $1, $3, $6, $7, $8}' 

--- 22 A 
--- 22 G 
--- 22 C 
--- 22 C 
--- 22 C 

aber ich kann es nicht richtig machen. kann awk und sed Befehl es tun?

Vielen Dank.

+0

habe ich versucht, das oben.Es hat sie nur erfolgreich getrennt, aber die Spalte kann nicht ausgewählt werden. –

Antwort

4

Verwenden Sie einfach die POSIX kompatibel split() Funktion auf $2 als

awk '{split($2,temp,":"); $2=temp[2];}1' file 
--- 16050075 16050075 A G 
--- 16050115 16050115 G A 
--- 16050213 16050213 C T 
--- 16050319 16050319 C T 
--- 16050527 16050527 C A 

Split der Säule 2 auf de-Begrenzer :, aktualisieren Sie die $2 Wert auf das gewünschte Element (temp[2]) und die restlichen Felder drucken ({}1 rekonstruiert alle einzelnen Felder basierend auf FS und druckt sie).

Empfehlen Sie dies über die Verwendung mehrerer De-Limiter, da es die absolute Position der einzelnen Felder ändert, während split() es einfach macht, die Position zu behalten und nur den erforderlichen Wert zu extrahieren.


Für Ihre aktualisierte Anforderung eine neue Spalte hinzuzufügen, gehen Sie nur

awk '{split($2,temp,":"); $2=temp[1] FS temp[2];}1' file 
--- 22 16050075 16050075 A G 
--- 22 16050115 16050115 G A 
--- 22 16050213 16050213 C T 
--- 22 16050319 16050319 C T 
--- 22 16050527 16050527 C A 

Alternativ, wenn Sie GNU awk/gawk Sie seine gensub() für einen regulären Ausdruck verwenden können (mit POSIX Zeichenklasse [[:digit]]) basierte Extraktion als

awk '{$2=gensub(/^([[:digit:]]+):([[:digit:]]+).*$/,"\\1 \\2","g",$2);}1' file 
--- 22 16050075 16050075 A G 
--- 22 16050115 16050115 G A 
--- 22 16050213 16050213 C T 
--- 22 16050319 16050319 C T 
--- 22 16050527 16050527 C A 

Der gensub(/^([[:digit:]]+):([[:digit:]]+).*$/,"\\1 \\2","g",$2) Teil erfasst nur die ersten beiden durch : begrenzten Felder mit den Erfassungsgruppen \\1 und \\2 und druckt die restlichen Felder als solche.

+0

was, wenn ich --- 22 16.050.075 16.050.075 AG drucken --- 22 16.050.115 16.050.115 GA --- 22 16.050.213 16.050.213 CT --- 22 16.050.319 16.050.319 CT --- 22 16.050.527 16.050.527 CA –

+0

Ich danke Ihnen sehr aktualisiert viel –

+0

@PeterChung: Verweise mein Update – Inian

4

Sie können auch die folgenden als Alternative versuchen, @ Inian ist viel besser und mehr tragbar lösungs-

awk -F '[ :]' '{print $1, $3, $6, $7, $8}' file 

Wo file Ihre ursprüngliche Eingabe enthält.

Output-

--- 16050075 16050075 A G 
--- 16050115 16050115 G A 
--- 16050213 16050213 C T 
--- 16050319 16050319 C T 
--- 16050527 16050527 C A 

EDIT

Mit der Änderung in der Eingabedatei (zusätzliche Spaltennummer 2), wird der Befehl über kann geändert werden, um Give-

awk -F '[ :]' '{print $1, $2, $3, $6, $7, $8}' file 

Ausgang

--- 22 16050075 16050075 A G 
--- 22 16050115 16050115 G A 
--- 22 16050213 16050213 C T 
--- 22 16050319 16050319 C T 
--- 22 16050527 16050527 C A 
+0

Danke, es funktioniert gut –

+0

Sie verpassten Spalte $ 2, fügen Sie es einfach hinzu. –

+0

@ClaesWikner, OP hat die Eingabedatei geändert. Ich habe jetzt mein Kommando geändert. Danke für die Köpfe hoch. – VM17

3

Sie könnten verwenden sed:

sed -r 's/..:([^:]+)[^ ]+/\1/' file 
Verwandte Themen