Shell脚本求助:如何提取CSV文件随机行的指定字段
解决从CSV文件随机提取电影字段的Shell脚本问题
看来你卡在了CSV字段拆分这一步,我帮你梳理下问题并给出修正方案:
你的现有问题分析
- 分隔符错误:你用了
cut -d " " -f1,但CSV文件通常是逗号分隔的,空格作为分隔符自然没法正确拆分字段; - 语法错误:
wc-l少了空格,正确写法是wc -l; - 随机行范围问题:
$RANDOM % LINES会生成0到LINES-1的数,但sed的行号从1开始,0行不会输出任何内容,需要调整为1到LINES的范围。
修正后的完整脚本
# 获取file.csv的总行数(避免多余的cat进程,更高效) LINES=$(wc -l < file.csv) # 生成1到总行数之间的随机行号 R_LINE=$((1 + RANDOM % LINES)) # 提取随机行内容 RANDOM_MOVIE=$(sed -n "${R_LINE}p" file.csv) # 按逗号拆分字段(假设CSV字段顺序为:NAME,YEAR,RATING,DESCRIPTION) NAME=$(echo "$RANDOM_MOVIE" | cut -d ',' -f1) YEAR=$(echo "$RANDOM_MOVIE" | cut -d ',' -f2) RATING=$(echo "$RANDOM_MOVIE" | cut -d ',' -f3) # 用-f4-确保提取从第4个字段到结尾的所有内容(防止描述里包含逗号) DESCRIPTION=$(echo "$RANDOM_MOVIE" | cut -d ',' -f4-) # 按照你需要的格式输出 echo "$NAME, $YEAR $RATING $DESCRIPTION" # 如果需要分开打印的话,用下面的语句: # echo "NAME: $NAME, YEAR: $YEAR" # echo "RATING: $RATING" # echo "DESCRIPTION: $DESCRIPTION"
进阶说明(如果你的CSV有复杂字段)
如果电影名称或描述里包含逗号(比如"The Shawshank Redemption, A",1994,9.3,Two imprisoned men bond...),cut就会失效,这时候可以用awk来处理带引号的CSV字段:
# 用awk的FPAT匹配规则提取字段 echo "$RANDOM_MOVIE" | awk -v FPAT='[^,]*|"[^"]*"' '{ gsub(/"/, "", $1) # 去掉名称的引号 gsub(/"/, "", $4) # 去掉描述的引号 printf "%s, %s %s %s\n", $1, $2, $3, $4 }'
内容的提问来源于stack exchange,提问作者ScienceG
相关产品推荐
相关产品推荐

