Как извлечь шаблон, но заполнить пропущенные значения в Bash? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть большой файл с разделителями табуляции (dummy.vcf) со столбцом ';'переменные с разделителями.Например:

AF_female=0.00000e+00;non_topmed_AF_female=0.00000e+00;control_AF_female=0.00000e+00
control_AF_female=0.00000e+00;non_topmed_AF_female=0.00000e+00
AF_female=0.00008e+00;non_topmed_AF_female=0.00000e+00

Я хотел бы извлечь строку «AF_female = X» для каждой строки с заполненными пропущенными значениями, поэтому длина нового файла равна оригиналу.Например:

AF_female=0.00000e+00  
NA  
AF_female=0.00008e+00 

Я пытался:

grep -o ';AF_female=[0-9].[0-9]*..[0-9]*' dummy.vcf

Однако это не добавляет строки, когда шаблон не соответствует.

Любая помощь будет очень ценится!

1 Ответ

0 голосов
/ 22 февраля 2019

, пожалуйста, попробуйте выполнить следующее, если вы в порядке с awk.

awk -F';' '
{
  val=""
  for(i=1;i<=NF;i++){
     if($i ~ /^AF_female=[0-9]+/){
         val=(val?val OFS $i:$i)
     }
  }
  if(val){
     print val
  }
  else{
     print "NA"
  }
}'  Input_file

. Он должен проверить все существующие значения AF_female=digits в строке и напечатает NA в случае, если он найдет NULL.совпадения в строке тоже.

Вывод будет следующим:

AF_female=0.00000e+00
NA
AF_female=0.00008e+00

Объяснение: Добавление пояснения к вышеприведенной команде.

awk -F';' '                           ##Starting awk program here and setting up field separator as semi-colon here.
{
  val=""                              ##Nullifying value of variable val here.
  for(i=1;i<=NF;i++){                 ##using a for loop which starts from i=1 to i=NF value. Where NF is number of fields value in current line.
     if($i ~ /^AF_female=[0-9]+/){    ##Checking condition if a field starts from AF_female and then digits then do following.
         val=(val?val OFS $i:$i)      ##Creating variable val whose value is current field value and concatenating its own value.
     }
  }
  if(val!=""){                        ##After coming out of for loop checking if variable val value is NOT NULL then do following.
     print val                        ##Printing value of variable val here.
  }
  else{                               ##Mentioning else of above if condition here.
     print "NA"                       ##Printing NA here.
  }
}' Input_file                         ##Mentioning Input_file name here.
...