файл, из которого я должен извлечь информацию, похож
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 или так?
Так как Вы упомянули, что данные всегда находятся в тех же столбцах, 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
}
}
}