You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Awk提取CSV文件中含Phytophthora的所有列?

提取CSV中包含Phytophthora子串的列方案(优先Awk)

Awk 核心实现脚本

针对普通逗号分隔、无内嵌逗号的CSV,用以下Awk脚本可一次性提取所有匹配列的标题和数据:

BEGIN { FS = ","; OFS = "," }
NR == 1 {
    # 遍历标题行,收集所有含Phytophthora的列索引
    match_cnt = 0
    for (i = 1; i <= NF; i++) {
        if ($i ~ /Phytophthora/) {
            cols[++match_cnt] = i
            headers[match_cnt] = $i
        }
    }
    # 输出匹配的标题行
    for (j = 1; j <= match_cnt; j++) {
        printf "%s%s", headers[j], (j == match_cnt ? "\n" : OFS)
    }
    next
}
# 处理数据行,仅输出匹配的列
{
    for (j = 1; j <= match_cnt; j++) {
        printf "%s%s", $(cols[j]), (j == match_cnt ? "\n" : OFS)
    }
}

使用方法

假设你的CSV文件名为data.csv,执行命令:

awk -f extract_phytophthora.awk data.csv

或直接单行执行:

awk 'BEGIN {FS=",";OFS=","} NR==1{match_cnt=0;for(i=1;i<=NF;i++){if($i~/Phytophthora/){cols[++match_cnt]=i;headers[match_cnt]=$i}};for(j=1;j<=match_cnt;j++){printf "%s%s",headers[j],(j==match_cnt?"\n":OFS)};next} {for(j=1;j<=match_cnt;j++){printf "%s%s",$(cols[j]),(j==match_cnt?"\n":OFS)}}' data.csv

示例验证

输入CSV(data.csv):

Sample ID,Phytophthora infestans,Phytophthora capsici,Tomato,Phytophthora sojae
S1,positive,negative,healthy,positive
S2,negative,positive,diseased,negative

输出结果:

Phytophthora infestans,Phytophthora capsici,Phytophthora sojae
positive,negative,positive
negative,positive,negative

脚本说明

  • 标题行(NR==1)遍历所有列,将包含Phytophthora的列索引存入cols数组,同时保存标题到headers数组,避免后续重复匹配
  • 数据行直接根据cols数组的索引输出对应字段,确保所有匹配列都被保留
  • 用printf代替print是为了避免末尾多出冗余逗号

复杂CSV场景(含内嵌逗号/引号)解决方案

如果CSV存在字段被引号包裹且内嵌逗号的情况,Awk基础实现会失效,推荐用专门的CSV处理工具csvkit:

  1. 安装csvkit:pip install csvkit
  2. 执行提取命令:
csvcut -c $(csvcut -n data.csv | grep -i phytophthora | cut -d, -f1 | paste -sd,) data.csv

该命令先列出所有列的索引和标题,筛选出含Phytophthora的列索引,再用csvcut提取这些列,完美处理带引号的复杂CSV。

内容的提问来源于stack exchange,提问作者user3637557

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:29:59