You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证目录中所有CSV文件的首行是否一致?

检查目录中所有CSV文件的首行是否一致

我有一个包含多个CSV文件的目录,想要编写Shell脚本检查每个文件的首行是否相同。比如下面的示例中,两个文件表头一致,检查应返回True:

❯ cat file1.csv
column1,column2,column3
3,1,3
4,3,9
❯ cat file2.csv
column1,column2,column3
5,4,1
1,8,2

之前找过类似问题,但没找到完全匹配的,有个问题是检查单个文件内所有行是否相同。

我已尝试的方法:

  • 用echo "$(ls -AU | head -1)"可以获取一个文件的首行
  • 想过验证所有文件首行是否等于这个值,偏好简洁管道而非for循环,但不知道怎么实现
  • 试过用uniq和wc的方案,但这两个命令似乎只适用于遍历单个文件的行,没法处理多个文件的首行集合

解决方案

方法1:提取首行后去重统计

直接提取所有CSV文件的首行,去重后统计行数,若结果为1则所有首行一致:

head -q -n1 *.csv | uniq | wc -l

输出为1时返回True,否则返回False。封装成脚本:

#!/bin/bash
header_count=$(head -q -n1 *.csv | uniq | wc -l)
if [ "$header_count" -eq 1 ]; then
    echo "True"
else
    echo "False"
    echo "不同的首行及对应文件:"
    head -q -v -n1 *.csv | sort | uniq -c
fi
  • head -q -n1 *.csv:-q不显示文件名,-n1提取每个文件首行
  • uniq:合并相同内容的行
  • wc -l:统计去重后的行数

方法2:对比基准首行(循环版)

以第一个CSV文件的首行为基准,逐个对比其他文件:

#!/bin/bash
first_file=$(ls *.csv | head -1)
first_header=$(head -n1 "$first_file")
all_same=true

for file in *.csv; do
    current_header=$(head -n1 "$file")
    if [ "$current_header" != "$first_header" ]; then
        all_same=false
        echo "差异文件:$file,首行:$current_header"
    fi
done

echo "$all_same"

逻辑清晰,适合需要定位差异文件的场景。

方法3:用awk一次性处理

用awk提取每个文件首行并对比,效率更高:

awk 'FNR==1 {
    if (!first) first=$0;
    else if ($0 != first) {
        print "False"; exit 1
    }
} END {print "True"}' *.csv
  • FNR==1:仅处理每个文件的第一行
  • 首次读取时记录基准首行,后续行若不匹配直接输出False并退出
  • 全部处理完成后输出True

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:55:17