Regex awk使用文件中的匹配字符串对总计进行计数和求和

Regex awk使用文件中的匹配字符串对总计进行计数和求和,regex,awk,Regex,Awk,我试图使用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 12685

我试图使用
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
SCNN1D 1 119
GABRD 3 240
TAS1R3 4 223 
所需输出

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
SCNN1D 1 119
GABRD 3 240
TAS1R3 4 223 
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
编辑

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
SCNN1D 1 119
GABRD 3 240
TAS1R3 4 223 
使用awk,可以在一个脚本中完成整个任务, 通过保持累积长度和每个单词的实例数的运行计数

尝试以下方法(尚未测试):


原始脚本有三个错误

  • 第二个
    awk
    块有一个模棱两可的输入规范:从管道读取数据和一个文件参数(
    count.txt
    )。在这种情况下,awk无法决定从何处读取
  • 结束
    部分中,编号字段将仅指读取的最后一行/记录的字段。这不是你想要的
  • 最后,第二个awk脚本缺少print语句的大括号
    {
  • 使用awk,可以在一个脚本中完成整个任务, 通过保持累积长度和每个单词的实例数的运行计数

    尝试以下方法(尚未测试):


    原始脚本有三个错误

  • 第二个
    awk
    块有一个不明确的输入规范:从管道读取和一个文件参数(
    count.txt
    )。在这种情况下,awk无法决定从何处读取
  • 结束
    部分中,编号字段将仅指上次读取的行/记录的字段。这不是您想要的
  • 最后,第二个awk脚本缺少print语句的大括号
    {
  • 你可以做:

    awk '{c1[$5]++; c2[$5]+=($3-$2)} 
         END{for (e in c1) print e, c1[e], c2[e]}' input
    
    请注意,记录的顺序可能与原始文件中的顺序不同。

    您可以执行以下操作:

    awk '{c1[$5]++; c2[$5]+=($3-$2)} 
         END{for (e in c1) print e, c1[e], c2[e]}' input
    
    $ 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
    

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

    awk为文件中的匹配字符串生成正确的计数,但似乎仅使用匹配中的最后一条记录作为长度……我在编辑中添加了输出。谢谢:)。awk生成正确的计数对于文件中的匹配字符串,但似乎仅使用匹配中的最后一条记录作为长度…我在编辑中添加了输出。谢谢:)。只需知道,如果顺序与文件顺序相同--这是巧合。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:我想就是今天早上它从我的键盘上滚下来的样子。编辑过的…只要知道如果顺序与文件顺序相同--这是巧合的。Awk数组是无序的。为什么写
    print e FS c1[e]FS c2[e]
    而不是
    打印e,c1[e],c2[e]
    ?为什么
    c2[$5]+=$3;c2[$5]=$2
    而不是
    c2[$5]+=($3-$2)
    ?@EdMorton:我想这就是今天早上我键盘上的方式。编辑…这只在文件按$5分块排序时有效,对吗?对。希望OP不会在他/她的示例中显示有序输入,如果这不是他们真正拥有的。这只在文件按$5分块排序时有效,对吗?对。希望OP会ldn如果他们的示例中没有顺序输入,则不显示该示例中的顺序输入。
    $ 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