如何用cut命令提取pokemon.csv每行第三字段并优化分类循环
Shell脚本按Type1属性分类宝可梦CSV文件优化方案
方案可行性说明
你提到的通过cut提取Type1字段生成循环列表的思路是可行的,只需要补充去重、跳表头的逻辑即可,无需手动罗列全量属性值。
原有写法的问题修正
- 原思路里的
for i inpokemon.csv | cut -d , -f 3``写法有语法错误:不能直接把csv文件作为命令传入管道,需要给cut指定文件参数,同时要跳过表头、去重避免重复循环,正确的循环列表生成写法是:
其中for i in $(cut -d ',' -f 3 "$1" | tail -n +2 | sort -u)tail -n +2作用是跳过csv第一行的表头,sort -u作用是对提取到的Type1属性去重,每个属性只循环一次。 - 原有脚本的mkdir命令建议加
-p参数:mkdir -p "$i",避免重复创建文件夹时报错。 - 原有grep匹配逻辑有误:直接grep属性值会匹配到整行任意位置的内容(比如Type2字段匹配上也会被误分类),建议用awk精确匹配第三字段,同时保留表头到每个分类csv中。
- 原有代码中包裹cat命令的反引号是多余的,反引号用于捕获命令输出,直接执行命令无需加反引号。
优化后完整脚本
#!/bin/bash # 按Type1属性分类宝可梦csv脚本 if [ $# -eq 0 ]; then echo "Error: Missing Filename" echo "USAGE: sh $0 <pokemon.csv>" exit 1 fi if [ ! -f "$1" ]; then echo "Error: File $1 does not exist" exit 1 fi if [ ! -r "$1" ]; then echo "Error: File $1 is not readable" exit 1 fi echo "FILE $1 is found, start classification..." # 自动提取所有Type1属性去重后循环 for type in $(cut -d ',' -f 3 "$1" | tail -n +2 | sort -u) do # 创建属性文件夹,不存在才创建 mkdir -p "$type" # 精确匹配Type1为当前属性的行,包含表头写入对应csv awk -F',' -v t="$type" 'NR==1 || $3==t' "$1" > "${type}/pokemon_${type}.csv" done echo "Classification completed"
内容的提问来源于stack exchange,提问作者朱旭翔
相关产品推荐
相关产品推荐

