Linux下不用awk过滤CSV非空行及倍数求和脚本开发咨询
问题1:过滤CSV文件中最后两列含空值的行
你的CSV示例里空值是带空格的(比如, , e里第二列是空格、, g, 里第三列是空格),之前的cut命令参数有误——正确的cut应该用-d","指定分隔符,-f2,3选择第2、3列,同时要匹配包含空格空值的情况。
可以用以下命令实现:
# 合并表头和过滤后的内容,一次性输出结果 { head -n1 file.csv; tail -n+2 file.csv | grep -E ", [^,]+, [^,]+$"; } | cut -d"," -f2,3
命令解释:
head -n1 file.csv:提取CSV的表头行tail -n+2 file.csv:从第二行开始处理数据行grep -E ", [^,]+, [^,]+$":匹配第二、三列都有非空内容的行([^,]+表示至少一个非逗号字符,确保列内容不为空)- 最后用
cut截取第2、3列,输出结果与你期望的一致:
f2 f3 b, c i, j
问题2:提取文本文件中指定数字的倍数并求和的Linux脚本
创建脚本sum_multiples.sh,内容如下:
#!/bin/bash # 校验参数数量是否正确 if [ $# -ne 2 ]; then echo "用法: $0 <文本文件> <数字>" exit 1 fi file="$1" target_num="$2" # 校验文件是否存在 if [ ! -f "$file" ]; then echo "错误: 文件 $file 不存在" exit 1 fi # 校验第二个参数是否为正整数 if ! [[ "$target_num" =~ ^[0-9]+$ ]]; then echo "错误: 第二个参数必须是正整数" exit 1 fi sum=0 # 遍历文件每一行,筛选倍数并求和 while read -r line; do if [[ "$line" =~ ^[0-9]+$ ]]; then if [ $((line % target_num)) -eq 0 ]; then sum=$((sum + line)) fi fi done < "$file" echo "数字 $target_num 的倍数总和为: $sum"
使用方法:
- 给脚本添加执行权限:
chmod +x sum_multiples.sh - 运行脚本:
./sum_multiples.sh 数字文件.txt 3(假设数字文件.txt是每行一个数字的文本文件)
示例:若数字文件.txt内容为:
1 3 6 8 9
执行./sum_multiples.sh 数字文件.txt 3会输出:数字 3 的倍数总和为: 18
内容的提问来源于stack exchange,提问作者Sharpe
相关产品推荐
相关产品推荐

