如何用Bash脚本循环处理两个文件夹中对应文件的匹配列内容
批量匹配两个文件夹对应文件的第一列并保留匹配行
这个批量处理的需求很常见,我给你两种实用的方案,你可以根据自己熟悉的工具来选择:
方案一:使用Bash脚本(适合Linux/macOS)
这种方式处理文本文件效率很高,不需要额外安装依赖,直接用系统自带的命令就能搞定。
首先,假设你的两个文件夹分别叫folder1和folder2,我们先创建一个output文件夹来存放处理后的结果:
mkdir -p output
然后编写脚本match_files.sh:
#!/bin/bash # 获取两个文件夹中的文件列表,按自然顺序排序确保一一对应 files1=($(ls -v folder1/)) files2=($(ls -v folder2/)) # 遍历每一对文件 for i in "${!files1[@]}"; do file1="folder1/${files1[$i]}" file2="folder2/${files2[$i]}" output_file="output/${files2[$i]}" # 结果文件名和folder2的原文件一致 # 使用awk提取folder1文件的第一列作为匹配键,过滤folder2的对应文件 awk 'NR==FNR {keys[$1]=1; next} $1 in keys' "$file1" "$file2" > "$output_file" echo "处理完成:$output_file" done
脚本说明:
ls -v是按自然顺序排序文件名(比如file1.txt、file2.txt会按数字顺序排列,避免file10.txt排在file2.txt前面),确保两个文件夹的文件能正确对应。- awk命令的逻辑:先读取第一个文件(folder1的文件),把第一列内容存入
keys数组;再读取第二个文件(folder2的文件),只保留第一列存在于keys中的行。 - 处理后的文件会保存在
output文件夹里,文件名和folder2的原文件一致。
使用时,给脚本加执行权限然后运行:
chmod +x match_files.sh ./match_files.sh
方案二:使用Python脚本(跨平台,适合Windows/Linux/macOS)
如果你更熟悉Python,这个方案更直观,也方便调整细节逻辑。
先创建output文件夹,然后编写match_files.py:
import os from glob import glob # 定义文件夹路径 folder1 = "folder1" folder2 = "folder2" output_dir = "output" # 创建输出文件夹(如果已存在则跳过) os.makedirs(output_dir, exist_ok=True) # 获取两个文件夹的文件列表,按名称排序 files1 = sorted(glob(os.path.join(folder1, "*"))) files2 = sorted(glob(os.path.join(folder2, "*"))) # 遍历每一对文件 for f1_path, f2_path in zip(files1, files2): # 生成输出文件路径,和folder2的原文件同名 f2_filename = os.path.basename(f2_path) output_path = os.path.join(output_dir, f2_filename) # 读取folder1文件的第一列,存入集合(实现快速查找) with open(f1_path, "r", encoding="utf-8") as f1: keys = set() for line in f1: stripped_line = line.strip() if stripped_line: first_col = stripped_line.split()[0] keys.add(first_col) # 过滤folder2的文件,保留第一列匹配的行 with open(f2_path, "r", encoding="utf-8") as f2, open(output_path, "w", encoding="utf-8") as out: for line in f2: stripped_line = line.strip() if not stripped_line: continue # 跳过空行,不需要的话可以删除这行 first_col = stripped_line.split()[0] if first_col in keys: out.write(line) print(f"处理完成:{output_path}")
脚本说明:
sorted(glob(...))确保文件按名称排序,保证两个文件夹的文件一一对应;如果你的文件需要按其他规则匹配(比如创建时间),可以修改排序逻辑。- 使用
set存储folder1的第一列内容,这样查找匹配的速度非常快(O(1)时间复杂度),适合处理大文件。 - 代码中默认跳过空行,如果你的文件需要保留空行,可以删除对应的判断语句。
- 支持指定文件编码(这里用
utf-8),如果你的文件是其他编码(比如gbk),可以修改encoding参数。
运行脚本:
python match_files.py
注意事项:
- 确保两个文件夹的文件数量相同,排序后能一一对应;如果文件名有特殊命名规则,可以调整排序逻辑适配。
- 大文件场景下,Bash方案的效率更高;如果需要处理复杂的分隔符或额外逻辑,Python方案更灵活。
内容的提问来源于stack exchange,提问作者Anna1364
相关产品推荐
相关产品推荐

