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。不客气。