строка извлечения из файла

файл, из которого я должен извлечь информацию, похож

2       41620   .       T       G       100     PASS    AC=3;AF=0.000599042;AN=5008;NS=2504;DP=18872;EAS_AF=0;AMR_AF=0;AFR_AF=0;EUR_AF=0;SAS_AF=0.0031;AA=.|||;CSQ=G|ENSG00000184731|ENST00000327669|Transcript|missense_variant|954|954|318|K/N|aaA/aaC|||-1|tolerated(0.47)|benign(0)||||;GENCODE=ENST00000327669

вывод, в котором я нуждаюсь, был бы

2   41620   CSQ=G    missense_variant

крупнейшие поля всегда делятся на |||, но не, что 2 41620 от первого поля и CSQ=G, и missense вариант от следующего. Это не должен ни быть missense_variant, ни что-то вдоль строк, но это всегда - первое и четвертое поле после первого |||.

Как достигнуть в жемчуге, awk, sed или так?

0
задан 17 February 2016 в 08:46

1 ответ

Так как Вы упомянули, что данные всегда находятся в тех же столбцах, AWK подходит для этой задачи. Однако мелочь - то, что у Вас есть данные, которые являются до определенного предела, имеет пространство как разделитель, но затем переключается на использование вертикальной панели как разделитель. Таким образом нам нужно немного более сложного хакерства AWK.

awk '{gsub(/[;]/," ");printf "%s %s ",$1,$2; for(i=1;i<=NF;i++){ if($i~/\|\|\|/) {gsub(/\|/," ");printf "%s %s",$(i+1),$(i+5);break} } printf "\n"; }' testData.txt

Для помещения вышеупомянутого кода в сценарии формы,

#!/usr/bin/awk -f 

{ 
  gsub(/[;]/," ");
  printf "%s %s ",$1,$2; 
  for(i=1;i<=NF;i++){ 
     if($i~/\|\|\|/) {
        gsub(/\|/," ");
        printf "%s %s",$(i+1),$(i+5);
        break
     } 
   } 
   printf "\n";
}

Помещенный, что в файл, назовите его myScript.awk или что-либо, добавьте исполнительные полномочия с chmod +x myScript.awk и дайте ему входной файл как аргумент

выполненный Образец:

$ chmod +x dataExtract.awk
$ ./dataExtract.awk testData.txt                               
2 41620CSQ=G missense_variant

примечание Стороны: в вопросе Вы сказали missense_variant, 4-е поле, но на самом деле это - 5-е поле в примере, который Вы отправили. Я корректировался соответственно

Редактирование согласно просьбе в комментариях:

#!/usr/bin/awk -f 

{ 
  gsub(/[;]/," ");
  printf "%s\t%s\t",$1,$2; 
  for(i=1;i<=NF;i++){ 
     if($i~/\|\|\|/) {
        gsub(/\|/," ");
        printf "%s\n" $(i+5);
        break
     } 
   } 
}
-1
ответ дан 29 September 2019 в 12:01

Другие вопросы по тегам:

Похожие вопросы: