如何验证目录中所有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
相关产品推荐
相关产品推荐

