Печать столбцов, начинающихся с определенной строки

11

У меня есть файл, который выглядит примерно так:

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

Как видите, каждая строка имеет немного различное количество столбцов. Я специально хочу столбец 1, столбец 2, столбец 3, столбец 4 и столбец, который начинается сANC=

Желаемый вывод:

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

Я обычно использую команду awk для разбора файлов:

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

Есть ли простой способ изменить эту команду для работы в подобных ситуациях?

Я думаю, что-то вроде этого может работать:

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

Тем не менее, как я могу изменить это, чтобы также распечатать первые столбцы?

cosmictypist
источник

Ответы:

15

С awk:

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

  • for(...)проходит по всем полям, начиная с поля 5 ( i=5).
    • if($i~/^ANC=/) проверяет, начинается ли поле с ANC=
    • a=$i если да, установите переменную a в это значение
  • print $1,$2,$3,$4,aпечать полей 1-4 следует все , что хранится в a.

Можно сочетать с BEGIN {OFS="\t"}конечно.

хаос
источник
что делает i=5?
космический обозреватель
@ stellar01 это запускает цикл в поле номер 5.
хаос
0

Предполагая, что ANC=столбец всегда является вторым по последнему столбцу (как в примере данных):

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

NFколичество полей (столбцов), на которые awkразбивается каждая запись (строка). $(NF-1)это значение поля от второго до последнего.

Кусалананда
источник
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

краткое

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


источник