awk: определить столбец по условию, изменить значение и, наконец, распечатать все столбцы

Я хочу извлечь значение в каждой строке файла, которая идет после AA. Я могу сделать это так:

awk -F'[;=|]' '{for(i=1;i<=NF;i++)if($i=="AA"){print toupper($(i+1));next}}'

Это дает мне точную информацию, которая мне нужна, и преобразует ее в верхний регистр, что я и хочу сделать. Как я могу это сделать, а затем напечатать всю строку с этим измененным значением в предыдущей позиции? По сути, я пытаюсь найти и заменить, где значение изменено на верхний регистр.

РЕДАКТИРОВАТЬ:

Вот пример строки ввода:

11  128196  rs576393503 A   G   100 PASS    AC=453;AF=0.0904553;AN=5008;NS=2504;DP=5057;EAS_AF=0.0159;AMR_AF=0.0259;AFR_AF=0.3071;EUR_AF=0.006;SAS_AF=0.0072;AA=g|||;VT=SNP

и вот как я хотел бы, чтобы результат выглядел:

11  128196  rs576393503 A   G   100 PASS    AC=453;AF=0.0904553;AN=5008;NS=2504;DP=5057;EAS_AF=0.0159;AMR_AF=0.0259;AFR_AF=0.3071;EUR_AF=0.006;SAS_AF=0.0072;AA=G|||;VT=SNP

Все, что изменилось, это g после того, как AA= заменено на верхний регистр.


person spiral01    schedule 21.03.2018    source источник
comment
пожалуйста, добавьте образцы строк ввода и ожидаемый результат для тех, кто поможет в тестировании возможных решений.   -  person Sundeep    schedule 21.03.2018
comment
Я отредактировал свой вопрос, чтобы включить эту информацию. Спасибо.   -  person spiral01    schedule 21.03.2018
comment
если у вас есть GNU sed, будет ли это работать для всех ваших вариантов ввода? sed 's/\bAA=[^;=|]*\b/\U&/' .. если у вас нет GNU sed, попробуйте perl -pe 's/\bAA=[^;=|]*\b/\U$&/'   -  person Sundeep    schedule 21.03.2018
comment
Спасибо! Это отлично работает!   -  person spiral01    schedule 21.03.2018


Ответы (2)


Следование awk может помочь вам в этом.

awk '
{
  match($0,/AA=[^|]*/);
  print substr($0,1,RSTART+2) toupper(substr($0,RSTART+3,RLENGTH-3)) substr($0,RSTART+RLENGTH)
}
'   Input_file
person RavinderSingh13    schedule 21.03.2018
comment
Оба ответа работают отлично, но я принял этот, поскольку он использует awk в соответствии с вопросом. - person spiral01; 21.03.2018
comment
@spiral01, рад, что помог вам, удачи и удачного обучения :) - person RavinderSingh13; 21.03.2018

С GNU sed и perl, используя границы слов

$ echo 'SAS_AF=0.0072;AA=g|||;VT=SNP' | sed 's/\bAA=[^;=|]*\b/\U&/'
SAS_AF=0.0072;AA=G|||;VT=SNP
$ echo 'SAS_AF=0.0072;AA=g|||;VT=SNP' | perl -pe 's/\bAA=[^;=|]*\b/\U$&/'
SAS_AF=0.0072;AA=G|||;VT=SNP
  • \U будет заглавной строкой, следующей за ней до конца, или \E или другим модификатором регистра
  • используйте модификатор g, если в строке может быть более одного совпадения
person Sundeep    schedule 21.03.2018