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

Linux中忽略前2字段对比管道分隔文件,输出今日独全行

问题:对比两个管道分隔文件并忽略前2字段输出新增行

文件内容

yesterday.txt

1234|12|Bill|Blatt|programmer
3243|34|Bill|Blatt|dentist
98734|25|Jack|Blatt|programmer
748567|31|Mark|Spark|magician

today.txt

123|12|Bill|Blatt|programmer
3243|4|Bill|Blatt|dentist
934|25|Jack|Blatt|prograbber
30495|89|Dave|Scratt|slobber

需求

对比两个文件时忽略前2个字段,输出仅存在于today.txt中的完整行,预期输出到new_today.txt:

934|25|Jack|Blatt|prograbber
30495|89|Dave|Scratt|slobber

现有尝试问题

使用以下命令仅能得到去重后的字段内容,但无法保留原行的前2字段:

sort <(cut -d"|" -f3- yesterday.txt) <(cut -d"|" -f3- yesterday.txt) <(cut -d"|" -f3- today.txt) | uniq -u

解决方法

使用awk可以在保留原行的同时,基于前2字段以外的内容做对比,命令如下:

awk -F'|' '
NR==FNR {
    # 处理yesterday.txt,生成第3字段及以后的拼接key
    key = ""
    for(i=3; i<=NF; i++) {
        key = key (i>3 ? "|" : "") $i
    }
    seen[key] = 1
    next
}
{
    # 处理today.txt,生成相同规则的key
    key = ""
    for(i=3; i<=NF; i++) {
        key = key (i>3 ? "|" : "") $i
    }
    # 若key未在yesterday中出现,输出完整行
    if(!seen[key]) print $0
}' yesterday.txt today.txt > new_today.txt

命令说明

  1. -F'|':设置字段分隔符为管道符
  2. NR==FNR:仅对第一个输入文件(yesterday.txt)执行逻辑,将每行第3字段及以后的内容拼接成唯一标识key,存入seen数组标记为已存在
  3. 处理第二个文件(today.txt)时,同样生成每行的key,如果该key未在seen数组中出现,就输出当前完整行
  4. 最后通过> new_today.txt将结果写入目标文件

执行该命令后,new_today.txt的内容将完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:45:55