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

Unix Shell下两文件按列对比并输出差异至结果文件

Unix Shell下按列对比两文件并生成差异标记文件

我来给你搞定这个需求,用awk就能轻松实现——它天生擅长处理文本列操作,而且几乎所有Unix/Linux系统都自带,不用额外装工具~

核心思路

  1. 先读取第一个文件,把每行的每一列内容存进二维数组,同时记录好每行的列数,用来处理列数不一致的情况。
  2. 再读取第二个文件,逐行逐列和第一个文件的对应位置对比:
    • 内容匹配:结果列标记为=
    • 内容不同:直接输出第二个文件的该列内容
    • 列数不一致时:某一行其中一个文件列数不足,视为差异,直接输出存在的内容

示例文件

假设咱们有两个测试文件:

file1.txt

id code name place
123 abc Tom phoenix
345 xyz Harry seattle

file2.txt

id code name place
123 def Tom portland
345 xyz Harry seattle
678 ghi Alice chicago

实现命令

直接运行下面的awk命令,结果会自动保存到diff_result.txt:

awk '
NR == FNR {
    # 读取第一个文件,存储每行的每一列内容
    for (i=1; i<=NF; i++) {
        row_col[NR][i] = $i
    }
    # 记录第一个文件每行的列数,处理列数不一致的情况
    row_cols[NR] = NF
    next
}
{
    output_line = ""
    # 取两个文件当前行的最大列数,避免列数不一致时遗漏内容
    max_cols = (NF > row_cols[FNR]) ? NF : row_cols[FNR]
    for (i=1; i<=max_cols; i++) {
        if (i > NF) {
            # 第二个文件列数不足,输出第一个文件的对应列内容
            output_line = output_line row_col[FNR][i] " "
        } else if (i > row_cols[FNR]) {
            # 第一个文件列数不足,输出第二个文件的对应列内容
            output_line = output_line $i " "
        } else if ($i == row_col[FNR][i]) {
            # 内容匹配,标记为=
            output_line = output_line "= "
        } else {
            # 内容不同,输出第二个文件的对应列内容
            output_line = output_line $i " "
        }
    }
    # 去掉行末尾多余的空格,保证格式整洁
    sub(/ $/, "", output_line)
    # 写入结果文件
    print output_line > "diff_result.txt"
}
' file1.txt file2.txt

结果展示

运行命令后,diff_result.txt的内容如下:

= = = =
= def = portland
= = = =
678 ghi Alice chicago

可以看到:

  • 表头完全匹配,所有列都标记为=
  • 第二行的code和place列和file1不同,直接输出file2的内容
  • 第三行完全匹配,所有列标记为=
  • 第四行file1没有对应行,直接输出file2的整行内容

注意事项

  • 如果你的文件是制表符分隔的,需要给awk加上-F "\t"参数指定分隔符,比如:awk -F "\t" '...' file1.txt file2.txt
  • 如果需要每次生成全新的结果文件,运行命令前可以先执行rm -f diff_result.txt,避免追加旧内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:52:02