如何基于列名而非列号对数千列大文本文件执行条件过滤统计
大体积多列文件按列名过滤统计方案
以下方案仅遍历文件1次,无需提前单独查询列号,适配数千列的大体积文件,针对你给出的示例执行后直接返回预期结果2:
awk -F'[[:space:]]+' 'NR==1{for(i=1;i<=NF;i++) col[$i]=i} {if($col["ad"]=="c" && $col["bd"]=="water") cnt++} END{print cnt}' file.txt
参数说明:
-F'[[:space:]]+':适配多空格/制表符分隔的文本,若你的文件是严格制表符分隔可替换为-F'\t'提升执行效率- 第一行(表头行)执行时自动遍历所有列,生成
列名:列号的映射字典存入col数组 - 后续每行直接通过列名读取对应列的取值,按条件计数,最终输出匹配行数
原有尝试命令的问题
- 第一个awk命令逻辑错误:awk没有内置的列名自动映射能力,你写的
$colname1会读取未定义的colname1变量(默认空值),等价于判断整行内容是否为2,完全不符合过滤逻辑 - 第二个获取列号的命令存在语法缺失:
tr '\t'缺少替换目标参数,同时引号未闭合,完整的单独查询列号命令参考为:
# 仅查询列号的场景 head -n1 file.txt | tr '\t' '\n' | cat -n | grep "目标列名" # 提取纯数字列号 head -n1 file.txt | tr '\t' '\n' | grep -n "ad" | cut -d: -f1
内容的提问来源于stack exchange,提问作者Shelby Labuschagne
相关产品推荐
相关产品推荐

