【问题标题】:awk to count and sum total using matching string from fileawk 使用文件中的匹配字符串进行计数和总计
【发布时间】:2016-03-13 01:07:32
【问题描述】:

我正在尝试使用awk 获取文件中每个匹配字符串的总长度和每个匹配项的计数。 $5 中的匹配字符串是计数,每个 $3 - $2 的总和是总长度。希望下面的awk 是一个好的开始。谢谢你:)。

输入

chr1 1266716 1266926 chr1:1266716-1266926 TAS1R3
chr1 1267008 1267328 chr1:1267008-1267328 TAS1R3
chr1 1267394 1268196 chr1:1267394-1268196 TAS1R3
chr1 1268291 1268514 chr1:1268291-1268514 TAS1R3
chr1 1956371 1956503 chr1:1956371-1956503 GABRD
chr1 1956747 1956866 chr1:1956747-1956866 GABRD
chr1 1956947 1957187 chr1:1956947-1957187 GABRD
chr1 1220077 1220196 chr1:1220077-1220196 SCNN1D

期望的输出

TAS1R3 4 1555
GABRD 3 491
SCNN1D 1 119

awk

awk '{count[$5]++}
END {
  for (word in count)
    print $1,$2,$3,$4,word, count[word]
}' input > count | 
awk 'print $1,$2,$3,$4,word, count[word]
}
{ $6 = $3 - $2 }
1' count.txt > length

编辑

SCNN1D 1 119
GABRD 3 240
TAS1R3 4 223 

【问题讨论】:

    标签: regex awk


    【解决方案1】:

    你可以这样做:

    awk '{c1[$5]++; c2[$5]+=($3-$2)} 
         END{for (e in c1) print e, c1[e], c2[e]}' input
    

    请注意,记录的顺序可能与原始文件中的顺序不同。

    【讨论】:

    • 只要知道顺序和文件顺序一样——纯属巧合。 awk 数组是无序的。
    • 为什么写print e FS c1[e] FS c2[e]而不是print e, c1[e], c2[e]?为什么是c2[$5]+=$3; c2[$5]-=$2 而不是c2[$5]+=($3-$2)
    • @EdMorton:我想就像今天早上它从我的键盘上滚下来一样。已编辑...
    【解决方案2】:

    使用 awk,可以在一个脚本中完成整个事情, 通过保持累计长度的连续计数,每个单词的实例数。

    试试这个(尚未测试):

    awk '{
      offset1=$2; offset2=$3; word=$5
      TotalLength[word]=offset2 - offset1 # or just $3-$2
      count[word]++}
    END {
      for (word in count)
        print word, count[word], TotalLength[word]
    }' input
    

    原来的脚本有三个错误。

    1. 第二个awk 块有一个不明确的输入规范:从管道读取一个文件参数(count.txt)。在这种情况下,awk 无法决定从哪里读取。
    2. END 部分中,编号字段将仅引用最后 行/记录读取的字段。这不是你想要的。
    3. 最后,第二个 awk 脚本缺少 print 语句的左大括号 {

    【讨论】:

    • awk 为文件中的匹配字符串生成正确的计数,但似乎只使用匹配中的最后一条记录作为长度......我在编辑中添加了输出。谢谢你:)。
    【解决方案3】:
    $ cat tst.awk
    $5 != prev { if (NR>1) print prev, cnt, sum; prev=$5; cnt=sum=0 }
    { cnt++; sum+=($3-$2) }
    END { print prev, cnt, sum }
    
    $ awk -f tst.awk file
    TAS1R3 4 1555
    GABRD 3 491
    SCNN1D 1 119
    

    【讨论】:

    • 这仅适用于文件按 $5 块排序的情况,对吗?
    • 正确。如果这不是他们真正拥有的,希望 OP 不会在他/她的示例中显示有序输入。
    猜你喜欢
    • 2015-04-20
    • 2016-06-10
    • 2020-05-04
    • 2020-10-16
    • 1970-01-01
    • 2015-08-10
    • 2021-02-10
    • 2023-02-22
    • 1970-01-01
    相关资源
    最近更新 更多