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

如何用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

注意事项:

  1. 确保两个文件夹的文件数量相同,排序后能一一对应;如果文件名有特殊命名规则,可以调整排序逻辑适配。
  2. 大文件场景下,Bash方案的效率更高;如果需要处理复杂的分隔符或额外逻辑,Python方案更灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:21:13