You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于Bash脚本实现CSV文件指定列精准搜索与结果存储的技术咨询

嘿,我来帮你搞定这些Bash处理CSV的问题,咱们一个个来解决:

1. 仅在第二列精准搜索

你之前的grep会匹配整行的任意位置,所以才会出现搜“LName 2”也命中的情况。咱们换成awk来精准定位列,因为你的CSV是用, (逗号加空格)分隔的,所以可以指定分隔符来锁定第二列:

read -p "What is your first name?: " fname
# 用awk匹配第二列,再通过grep判断是否有结果
if awk -v search="$fname" -F', ' '$2 == search' data.csv | grep -q .; then
    printf "%s\n" "Exist."
else
    printf "%s\n" "Sorry, Not Exist."
fi

这里用awk -v把Shell变量fname传给awk,避免引号转义的坑;-F', '指定分隔符,$2 == search只匹配第二列完全等于搜索内容的行,最后用grep -q .检查awk有没有输出内容。

2. 获取匹配行并存入数组

如果要把所有匹配的行存到数组里,可以用mapfile(Bash 4+支持)直接读取awk的输出,非常方便:

read -p "What is your first name?: " fname
# 把匹配的行读取到数组matching_lines中
mapfile -t matching_lines < <(awk -v search="$fname" -F', ' '$2 == search' data.csv)

# 判断数组长度,检查是否有匹配结果
if [ ${#matching_lines[@]} -gt 0 ]; then
    printf "Found %d matching records:\n" ${#matching_lines[@]}
    # 遍历数组输出每一行
    for line in "${matching_lines[@]}"; do
        echo "$line"
    done
else
    printf "%s\n" "Sorry, Not Exist."
fi

如果你的Bash版本比较旧(低于4.0),没有mapfile,可以用while read循环手动填充数组:

read -p "What is your first name?: " fname
matching_lines=()
# 循环读取awk的输出,存入数组
while IFS= read -r line; do
    matching_lines+=("$line")
done < <(awk -v search="$fname" -F', ' '$2 == search' data.csv)

# 后续判断和遍历逻辑和上面一样

3. 多列搜索(第二列+第三列)

要同时在第二和第三列搜索,只需要修改awk的条件,用||表示“或”即可:

read -p "Enter name to search: " name
mapfile -t matching_lines < <(awk -v search="$name" -F', ' '$2 == search || $3 == search' data.csv)

if [ ${#matching_lines[@]} -gt 0 ]; then
    printf "Found %d records:\n" ${#matching_lines[@]}
    printf "%s\n" "${matching_lines[@]}"
else
    printf "%s\n" "Sorry, Not Exist."
fi

如果需要部分匹配(比如输入“FName”就能匹配所有第二列包含FName的行),可以把==换成index()函数(子字符串匹配,比正则更安全,避免特殊字符干扰):

mapfile -t matching_lines < <(awk -v search="$name" -F', ' 'index($2, search) > 0 || index($3, search) > 0' data.csv)

小提醒

如果你的CSV里有包含逗号的字段(比如"Doe, John"这种带引号的复杂格式),上面的简单awk处理就会失效,这时候建议用专门的CSV工具比如csvkit来处理,但从你的示例数据来看,目前的方案完全够用。

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

火山引擎 最新活动