2016-07-18 16 views
-1

Ich habe eine Datei, die Zeilen mit dem folgenden Format enthält. Ich würde nur die erste Spalte halten möchten und die Spalte den String mit folgendem Format NC_XXXX.1wählen Sie bestimmte Spalten aus komplexen Linien

484-2117 16 gi|9634679|ref|NC_002188.1| 188705 23 21M * 0 0 CGCGTACCAAAAGTAATAATT IIIIIIIIIIIIIIIIIIIII AS:i:-6 XN:i:0 XM:i:1 XO:i:0 XG:i:0 NM:i:1 MD:Z:0G20 YT:Z:UU 
787-1087 16 gi|21844535|ref|NC_004068.1| 7006 23 20M * 0 0 CTATACAACCTACTACCTCA IIIIIIIIIIIIIIIIIIII AS:i:-6 XN:i:0 XM:i:1 XO:i:0 XG:i:0 NM:i:1 MD:Z:19T0 YT:Z:UU 
..... 
.... 
... 

Ausgabe enthält:

484-2117 NC_002188.1 
787-1087 NC_004068.1 

Antwort

2

So etwas wie dies in Perl hinzuzufügen:

#!/usr/bin/env perl 
use strict; 
use warnings; 

while (<DATA>) { 
    my ($id, $nc) = m/^([\d\-]+).*(NC_[\d\.]+)/; 
    print "$id $nc\n"; 
} 

__DATA__ 
484-2117 16 gi|9634679|ref|NC_002188.1| 188705 23 21M * 0 0 CGCGTACCAAAAGTAATAATT IIIIIIIIIIIIIIIIIIIII AS:i:-6 XN:i:0 XM:i:1 XO:i:0 XG:i:0 NM:i:1 MD:Z:0G20 YT:Z:UU 
787-1087 16 gi|21844535|ref|NC_004068.1| 7006 23 20M * 0 0 CTATACAACCTACTACCTCA IIIIIIIIIIIIIIIIIIII AS:i:-6 XN:i:0 XM:i:1 XO:i:0 XG:i:0 NM:i:1 MD:Z:19T0 YT:Z:UU 

Ausgang:

484-2117 NC_002188.1 
787-1087 NC_004068.1 

Was reduziert auf einen einzigen Liner von:

Hinweis - dies entspricht speziell einer ersten Spalte aus Nummer und Bindestrich - Sie könnten dies mit einer größeren Regex-Übereinstimmung tun.

1

awk zur Rettung!

$ awk -F' +|\\|' '{for(i=2;i<=NF;i++) if($i ~ /^NC_[0-9.]+$/) {print $1,$i; next}}' file 
484-2117 NC_002188.1 
787-1087 NC_004068.1 

wenn der Raum ein Register char ist, müssen die Begrenzungsliste

$ awk -F' +|\\||\t' ... 
+0

, dass fast funktioniert, aber es gibt 16 gi als auch auf meine Daten – user2300940

+0

Der Raum vielleicht eine Lasche ist, müssen hinzufügen Trennzeichen in das Feld ein. – karakfa

0

mit GNU-awk unten Lösung sein könnte:

awk '{printf "%s %s\n",$1,gensub(/.*(NC_.*\.1).*/,"\\1",1,$0)}' file 

Ausgabe

484-2117 NC_002188.1 
787-1087 NC_004068.1 

Eine restriktivere Version

awk '{printf "%s %s\n",$1,gensub(/.*(NC_[[:digit:]]*\.1).*/,"\\1",1,$0)}' file 
0

Mit Perl wäre:

perl -anE'say "$F[0] ",(split /\|/, $F[2])[3]' file 

oder awk:

awk -F'\\|| +' '{print $1,$6}' file 
0
awk -F'[ |]' '{print $1,$10}' file 
484-2117 NC_002188.1 
787-1087 NC_004068.1 
Verwandte Themen