求Linux命令:按每1000行间隔统计TSV文件第7列唯一值数量
解决TSV文件按每1000行统计第7列唯一值数量的命令
正确实现命令
可以用awk一次性完成分组、去重和统计,无需多次管道调用,效率更高:
awk -F'\t' '{ # 计算当前行所属的分组(1-10组) group = int((NR - 1) / 1000) + 1 # 用数组键存储第7列的值,自动去重 unique[$7] = 1 # 每满1000行,输出当前组的唯一值数量并清空数组 if (NR % 1000 == 0) { print "组" group " 第7列唯一值数量:" length(unique) delete unique } } # 处理最后一组不足1000行的情况(本例刚好10000行,可省略,但保留更通用) END { if (length(unique) > 0) { print "组" group " 第7列唯一值数量:" length(unique) } }' your_tsv_file.tsv
你之前命令的问题
- 未指定输出第7列:原
awk命令只截取了行,但没提取第7列,后续sort和uniq处理的是整行内容而非目标列 - 仅处理第一组:只能统计1-1000行的数据,无法自动遍历所有10组
- 重定向位置错误:
>myfile应该放在命令末尾,否则会提前截断输出
替代方案(用管道分步处理)
如果更喜欢分步操作,也可以用循环批量处理每组:
for i in {0..9}; do start=$((i*1000 + 1)) end=$(( (i+1)*1000 )) echo "组$((i+1)) 唯一值数量:" awk -F'\t' "NR>=$start && NR<=$end {print \$7}" your_tsv_file.tsv | sort -u | wc -l done
内容的提问来源于stack exchange,提问作者Rajesh Pal
相关产品推荐
相关产品推荐

