技术问询:使用awk汇总文本文件及序列3字符分段统计需求
没问题,我来帮你搞定这两个问题!
1. 如何使用awk工具对文本文件进行内容汇总?
awk是处理文本汇总的利器,我给你几个最常用的场景和示例,直接就能用:
统计文件总行数:
awk 'END{print NR}' your_file.txt原理:
NR是awk内置变量,代表当前处理的行数,END块会在所有行处理完后执行,直接输出总行数。统计文件总单词数:
awk '{sum += NF} END{print sum}' your_file.txt原理:
NF是每行的字段数(默认空格分隔),累加所有行的NF就能得到总单词数。统计某一列的数值总和:
比如要统计第3列的总和,空格分隔的文件用这个:awk '{sum += $3} END{print sum}' your_file.txt如果是CSV(逗号分隔),加上
-F ','指定分隔符:awk -F ',' '{sum += $3} END{print sum}' your_file.csv统计某列唯一值的出现次数:
比如统计第2列每个值出现的次数:awk '{count[$2]++} END{for (val in count) print val, count[val]}' your_file.txt原理:用数组
count存每个值的计数,遍历数组输出结果。
2. 分割字符序列为3字符片段并统计出现次数
针对你给的FASTA格式序列(带ID、序列可能换行/含空格),我写了一个awk脚本可以完美处理:
第一步:准备脚本(可读性更好)
保存为count_3mer.awk:
/^>/ { # 遇到ID行时,先处理上一个ID的序列 if (seq != "") { seq_len = length(seq) # 从第1个字符到倒数第3个,每次取3个字符 for (i = 1; i <= seq_len - 2; i++) { fragment = substr(seq, i, 3) count[fragment]++ } seq = "" # 重置序列变量 } next # 跳过ID行,不处理 } { # 非ID行:合并序列,同时去掉行内的空格 seq = seq gensub(/ /, "", "g", $0) } END { # 处理最后一个ID的序列 seq_len = length(seq) for (i = 1; i <= seq_len - 2; i++) { fragment = substr(seq, i, 3) count[fragment]++ } # 输出每个3字符片段的出现次数 for (frag in count) { print frag, count[frag] } }
第二步:运行脚本
假设你的序列文件是seqs.fa,执行命令:
awk -f count_3mer.awk seqs.fa
如果你不想保存脚本,也可以用单行命令直接运行:
awk '/^>/{if(seq!=""){len=length(seq);for(i=1;i<=len-2;i++){f=substr(seq,i,3);count[f]++};seq=""};next}{seq=seq gensub(/ /,"","g",$0)}END{len=length(seq);for(i=1;i<=len-2;i++){f=substr(seq,i,3);count[f]++};for(f in count)print f,count[f]}' seqs.fa
脚本说明
- 识别以
>开头的ID行,先处理之前累积的序列,避免遗漏上一个ID的内容; - 非ID行自动合并换行的序列,同时去掉序列中的空格(比如你示例里ID1序列的空格);
- 遍历每个完整序列,从左到右截取3字符片段,用数组统计次数;
- 最后输出所有片段及其出现次数。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

