awk:按条件识别列,更改值,最后打印所有列

时间:2018-03-21 11:38:50

标签: awk toupper

我想提取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=

2 个答案:

答案 0 :(得分:1)

关注awk可能对您有帮助。

awk '
{
  match($0,/AA=[^|]*/);
  print substr($0,1,RSTART+2) toupper(substr($0,RSTART+3,RLENGTH-3)) substr($0,RSTART+RLENGTH)
}
'   Input_file

答案 1 :(得分:1)

使用GNU sedperl,使用字边界

$ 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修饰符