Awk 统计数据文件中模式匹配之间的出现次数并生成报告

Awk 统计数据文件中模式匹配之间的出现次数并生成报告,awk,sed,bioinformatics,Awk,Sed,Bioinformatics,我的文件结构如下: MATCH A and B 001 005 101 MATCH A and C 020 400 MATCH B and C 001 156 807 920 我想生成一个如下所示的报告: A and B: 3 A and C: 2 B and C: 4 我想使用的工具是sed/awk。我知道sed可以在模式匹配之间打印行,但是下面的代码最终打印出整个文件 sed -n '/^MATCH/,/^MATCH/p' file.txt | wc -l 这将返回整个文件中的行数

我的文件结构如下:

MATCH A and B
001
005
101

MATCH A and C
020
400

MATCH B and C
001
156
807
920
我想生成一个如下所示的报告:

A and B: 3
A and C: 2
B and C: 4
我想使用的工具是sed/awk。我知道sed可以在模式匹配之间打印行,但是下面的代码最终打印出整个文件

sed -n '/^MATCH/,/^MATCH/p' file.txt | wc -l

这将返回整个文件中的行数。关于下一步去哪里看有什么建议吗?这似乎不是最常见的任务,我还没有找到很多其他建议。

这个
awk
应该可以:

awk -v RS= '{print $2,$3,$4":",NF-4}' file
A and B: 3
A and C: 2
B and C: 4
由于记录由一个空行分隔,并且
RS
设置为无,
我们只需要计算字段
NF
减去第一行


这可能更好:

awk -v RS= -F"\n" '{print $1":",NF-1}' file
MATCH A and B: 3
MATCH A and C: 2
MATCH B and C: 4
或删除匹配的
单词:

awk -v RS= -F"\n" '{sub("MATCH ","",$1);print $1":",NF-1}' file
A and B: 3
A and C: 2
B and C: 4

为了澄清任何混淆:sed是用于在单个行上进行简单替换的。时期句号。对于任何你需要awk的东西,你都不需要GNU awk。wrt RS值,如果需要一个超过1个字符的RS,则只需要GNU awk。设置
RS=
调用段落模式,该模式是POSIX,所有awk都支持(当然可能除了旧的、坏的awk)。有人告诉我,将RS设置为零是一个
gnu awk
函数。谢谢你提供的信息。不,它也可以在nawk、/usr/xpg4/bin/awk等中使用。当您想使用多字符regexp作为RS时,就像使用FS一样,您需要gawk。不客气。