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
命令说明
-F'|':设置字段分隔符为管道符NR==FNR:仅对第一个输入文件(yesterday.txt)执行逻辑,将每行第3字段及以后的内容拼接成唯一标识key,存入seen数组标记为已存在- 处理第二个文件(
today.txt)时,同样生成每行的key,如果该key未在seen数组中出现,就输出当前完整行 - 最后通过
> new_today.txt将结果写入目标文件
执行该命令后,new_today.txt的内容将完全符合预期。
内容的提问来源于stack exchange,提问作者bbaldwin81
相关产品推荐
相关产品推荐

