【问题标题】:awk: identify column by condition, change value, and finally print all columnsawk:按条件识别列,改变值,最后打印所有列
【发布时间】:2018-08-30 12:24:06
【问题描述】:

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

【问题讨论】:

  • 请添加示例输入行和预期输出以帮助测试可能的解决方案..
  • 我已编辑我的问题以包含此信息。谢谢。
  • 如果你有 GNU sed,这对你所有的输入情况都有效吗? sed 's/\bAA=[^;=|]*\b/\U&amp;/' .. 如果你没有 GNU sed,试试 perl -pe 's/\bAA=[^;=|]*\b/\U$&amp;/'
  • 谢谢!效果很好!

标签: awk toupper


【解决方案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

【讨论】:

  • 两个答案都很好,但我接受了这个,因为它根据问题使用 awk。
  • @spiral01,很高兴它对你有所帮助,干杯和快乐学习:)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2020-06-08
    • 2011-05-17
    相关资源
    最近更新 更多