【问题标题】:Concatenating array elements into a one string in for loop using awk使用awk在for循环中将数组元素连接成一个字符串
【发布时间】:2020-12-23 16:10:15
【问题描述】:

我正在处理一个变体调用格式 (vcf) 文件,我试图向你们展示我正在尝试做的事情:

输入:

1       877803  838425  GC      G
1       878077  966631  C       CCACGG

输出:

1       877803  838425  C       -
1       878077  966631  -       CACGG

总之,我正在尝试删除较长字符串的第一个字母。

这是我的代码:

awk 'BEGIN { OFS="\t" } /#/ {next}
{
    m = split($4, a, //)
    n = split($5, b, //)
    x = "-"
    delete y
    if (m>n){
        for (i = n+1; i <= m; i++) {
            y = sprintf("%s", a[i])
        }
        print $1, $2, $3, y, x
    }
    else if (n>m){
        for (j = m+1; i <= n; i++) {
            y = sprintf("%s", b[j]) ## Problem here
        }
        print $1, $2, $3, x, y
    }
}' input.vcf > output.vcf

但是,

  1. 我在第 15 行收到以下错误,甚至在第 9 行也没有

awk: cmd. line:15: (FILENAME=input.vcf FNR=1) fatal: attempt to use array y in a scalar context

  1. 我不知道如何使用 awk 将数组元素连接成一个字符串。

如果你们能帮助我,我会很高兴的。

圣诞快乐!

【问题讨论】:

  • 如果我正确理解您的问题,您就不能使用$4=substr($4,2) (etc) 吗?祝你好运。

标签: awk vcf-variant-call-format


【解决方案1】:

你可以试试这个awk:

awk -v OFS="\t" 'function trim(s) { return (length(s) == 1 ? "-" : substr(s, 2)); } {$4 = trim($4); $5 = trim($5)} 1' file

1   877803  838425  C   -
1   878077  966631  -   CACGG

更易读的形式:

awk -v OFS="\t" 'function trim(s) {
   return (length(s) == 1 ? "-" : substr(s, 2))
}
{
   $4 = trim($4)
   $5 = trim($5)
} 1' file

【讨论】:

    【解决方案2】:

    你可以使用awk的substr函数来处理第4个和第5个空格分隔的字段:

    awk '{ substr($4,2)==""?$4="-":$4=substr($4,2);substr($5,2)==""?$5="-":$5=substr($5,2)}1' file
    

    如果字段 4 中从位置 2 开始的字符串等于“”,则将字段 4 设置为“-”,否则,将字段 4 设置为从位置 2 到字段末尾的字段的提取。对字段 5 执行相同操作。使用简写 1 打印行是否修改。

    【讨论】:

      猜你喜欢
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 2014-08-02
      相关资源
      最近更新 更多