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
相关产品推荐
相关产品推荐

