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

Linux下如何按指定列合并两个文件且仅保留其中一个文件的行?

Linux环境下按指定列关联合并两个txt文件的实现命令

你需要的是按D列为关联键的左关联操作,保留fileone.txt的全部行,合并filetwo.txt的对应列,以下是两种常用实现方案:

方案1:使用join命令(无需保留fileone原有行序时首选)

join是Linux原生用于文件关联合并的工具,要求两个输入文件均按关联键排序,命令如下:

空白分隔符(空格/制表符分隔)场景

join -1 4 -2 1 -o 1.1,1.2,1.3,1.4,2.2,2.3,2.4 <(sort -k4 fileone.txt) <(sort -k1 filetwo.txt) > filethree.txt

逗号分隔场景

join -t, -1 4 -2 1 -o 1.1,1.2,1.3,1.4,2.2,2.3,2.4 <(sort -t, -k4 fileone.txt) <(sort -t, -k1 filetwo.txt) > filethree.txt

参数说明

  • -1 4:指定第一个文件(fileone.txt)的关联键为第4列(D列)
  • -2 1:指定第二个文件(filetwo.txt)的关联键为第1列(D列)
  • -o:自定义输出列顺序,1.x代表第一个文件的第x列,2.x代表第二个文件的第x列,刚好匹配你需要的A、B、C、D、E、F、G列顺序
  • <(sort ...):进程替换语法,用于实时对输入文件按关联键排序,满足join的输入要求

方案2:使用awk命令(需保留fileone原有行序时首选)

awk方案不需要对文件排序,可以完全保留fileone.txt的原有行顺序,命令如下:

空白分隔符(空格/制表符分隔)场景

awk 'NR==FNR {map[$1]=$2"\t"$3"\t"$4; next} {print $0"\t"map[$4]}' filetwo.txt fileone.txt > filethree.txt

逗号分隔场景

awk -F ',' 'NR==FNR {map[$1]=$2","$3","$4; next} {print $0","map[$4]}' filetwo.txt fileone.txt > filethree.txt

逻辑说明

  • 先读取filetwo.txt,将D列(第1列)作为键,E、F、G三列的内容存入map字典
  • 再逐行读取fileone.txt,输出当前行全部内容后,追加map中对应D键的E、F、G内容,全程不改变fileone的行序

注意事项

  • 如果fileone.txt中的D值在filetwo.txt中不存在,对应E、F、G列会输出为空,可根据需要修改命令补充默认填充值
  • 如果filetwo.txt存在重复的D值,awk默认保留最后一次出现的D值对应的列内容,join会输出所有匹配的行,可提前对filetwo.txt按D列去重避免重复输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 01:00:06