Drucken Sie Spalten, die mit einer bestimmten Zeichenfolge beginnen


11

Ich habe eine Datei, die ungefähr so ​​aussieht:

ID101     G    T     freq=.5     nonetype     ANC=.1     addinfor
ID102     A    T     freq=.3     ANC=.01    addinfor
ID102     A    T     freq=.01     type=1     ALT=0.022    ANC=.02    addinfor

Wie Sie sehen können, hat jede Zeile eine leicht unterschiedliche Anzahl von Spalten. Ich möchte speziell Spalte 1, Spalte 2, Spalte 3, Spalte 4 und die Spalte, die mit beginntANC=

Gewünschte Ausgabe:

ID101     G    T     freq=.5     ANC=.1
ID102     A    T     freq=.3     ANC=.01
ID102     A    T     freq=.01    ANC=.02

Im Allgemeinen verwende ich den Befehl an awk, um Dateien zu analysieren:

awk 'BEGIN {OFS = "\t"} {print $1, $2, $3, $4}'

Gibt es eine einfache Möglichkeit, diesen Befehl so zu ändern, dass er in solchen Situationen funktioniert?

Ich denke so etwas könnte funktionieren:

awk '{for(j=1;j<=NF;j++){if($j~/^ANC=/){print $j}}}'

Wie kann ich dies jedoch bearbeiten, um auch die ersten Spalten zu drucken?

Antworten:


15

Mit awk:

awk '{for(i=5;i<=NF;i++){if($i~/^ANC=/){a=$i}} print $1,$2,$3,$4,a}' file

  • for(...)Durchläuft alle Felder, beginnend mit Feld 5 ( i=5).
    • if($i~/^ANC=/) prüft, ob das Feld mit beginnt ANC=
    • a=$i Wenn ja, setzen Sie die Variable a auf diesen Wert
  • print $1,$2,$3,$4,aDrucken Sie die Felder 1 bis 4, gefolgt von dem, was in gespeichert ist a.

Kann BEGIN {OFS="\t"}natürlich mit kombiniert werden .


Was bedeutet das i=5tun?
Cosmictypist

@ stellar01 dies startet die Schleife bei Feld Nummer 5.
Chaos

0

Angenommen, die ANC=Spalte ist immer die vorletzte Spalte (wie in den Beispieldaten):

$ awk '{ print $1, $2, $3, $(NF-1) }' data.in
ID101 G T ANC=.1
ID102 A T ANC=.01
ID102 A T ANC=.02

NFist die Anzahl der Felder (Spalten), in die awkjeder Datensatz (jede Zeile) aufgeteilt wird. $(NF-1)ist der Wert des vorletzten Feldes.


0
perl -pale '$"="\t", $_="@{[@F[0..3],         grep {   /^ANC=/ } @F[4..$#F]]}"' yourfile
perl -lane '$,="\t",          print @F[0..3], grep {   /^ANC=/ } @F[4..$#F]'    yourfile
perl -lane '($,,$a)=("\t",0), print grep { $a++ < 4 or /^ANC=/ } @F'            yourfile

Kurz

$, => OFS @F[0..3]=>$F[0] $F[1] $F[2] $F[4]

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.