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

更改的只是AA=更改为大写后的g

遵循awk可能会对您有所帮助。

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

> 使用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修饰符

最新更新