如何用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:
- 安装csvkit:
pip install csvkit - 执行提取命令:
csvcut -c $(csvcut -n data.csv | grep -i phytophthora | cut -d, -f1 | paste -sd,) data.csv
该命令先列出所有列的索引和标题,筛选出含Phytophthora的列索引,再用csvcut提取这些列,完美处理带引号的复杂CSV。
内容的提问来源于stack exchange,提问作者user3637557
相关产品推荐
相关产品推荐

