如何用bash/awk检测CSV行变化 移动日期异常CSV到指定目录
解决方案
直接用单条awk检测加状态码判断就可以实现需求,无需多管道拼接,大文件场景下也能做到高效检测,完整可运行脚本如下:
#!/bin/bash # 创建目标目录,重复运行也不会报目录已存在错误 mkdir -p dir_different # 遍历当前目录下所有csv文件 for csv_file in *.csv; do # 跳过非文件项,避免无csv文件时通配符直接作为文件名的异常 [ -f "$csv_file" ] || continue # awk检测逻辑:只要发现第一列(timestamp列)有不同值就返回异常状态码 awk -F ',' ' # 跳过表头行,取第一个数据行的日期作为基准 NR == 2 { base_ts = $1 } # 后续行只要和基准日期不一样,直接退出并返回1(异常标识) NR > 2 && $1 != base_ts { exit 1 } ' "$csv_file" # 状态码非0即为异常文件,移动到目标目录 if [ $? -ne 0 ]; then mv -f "$csv_file" dir_different/ echo "已移动异常文件:$csv_file" fi done
说明
- 效率优势:不需要读完整个文件,只要发现一个不符合的日期就立刻终止检测,百兆级大文件也能毫秒级出结果
- 兼容处理:所有变量加双引号,适配文件名带空格的场景
- 可调整性:如果你的timestamp不是第一列,把代码里的
$1改成对应列号即可;如果CSV分隔符不是逗号,修改-F ','里的分隔符即可
内容的提问来源于stack exchange,提问作者doraemon
相关产品推荐
相关产品推荐

