Друкуйте стовпці, які починаються певним рядком


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}}}'

Однак як я можу редагувати це, щоб також надрукувати перші колонки?

Відповіді:


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]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.