Wydrukuj kolumny rozpoczynające się od określonego ciągu

11

Mam plik, który wygląda mniej więcej tak:

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

Jak widać, każda linia ma nieco inną liczbę kolumn. W szczególności chcę kolumnę 1, kolumnę 2, kolumnę 3, kolumnę 4 i kolumnę, która zaczyna się odANC=

Pożądane wyjście:

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

Zazwyczaj używam polecenia awk do analizowania plików:

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

Czy istnieje prosty sposób na zmianę tego polecenia, aby działało w takich sytuacjach?

Myślę, że coś takiego może działać:

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

Jak mogę to jednak edytować, aby wydrukować również pierwsze kolumny?

kosmiczny typista
źródło

Odpowiedzi:

15

Z awk:

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

  • for(...)zapętla wszystkie pola, zaczynając od pola 5 ( i=5).
    • if($i~/^ANC=/) sprawdza, czy pole zaczyna się od ANC=
    • a=$i jeśli tak, ustaw zmienną a na tę wartość
  • print $1,$2,$3,$4,awydrukuj pola 1-4, a następnie wszystko, co jest zapisane a.

BEGIN {OFS="\t"}Oczywiście można to połączyć .

chaos
źródło
co robi i=5zrobić?
kosmicznytypista
@ stellar01 zaczyna się pętla na polu nr 5
chaos
0

Zakładając, że ANC=kolumna jest zawsze przedostatnią kolumną (jak w przykładowych danych):

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

NFto liczba pól (kolumn), na które awkdzieli się każdy rekord (wiersz). $(NF-1)jest wartością przedostatniego pola.

Kusalananda
źródło
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

Krótki

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


źródło