如何使用Linux命令将列结构不同的两个TXT文件合并为单个目标文件
跨结构TXT文件列合并的Linux命令实现方案
前置约定
- 两个输入文件均为带列头的纯文本表格,默认以制表符作为列分隔符,可根据实际文件格式调整分隔符参数
- 合并逻辑为通过两文件共有的A、B列做键匹配行,未匹配到的列位置自动填充空值
- 最终输出列顺序固定为A、B、C、D、E、F
方案1:awk原生实现(无额外依赖,全Linux发行版通用)
不依赖第三方工具,适配绝大多数纯文本表格场景,直接执行以下命令即可完成合并:
awk -F '\t' ' # 遍历第一个输入文件 NR==FNR { # 读取表头,记录各列的实际位置 if (FNR == 1) { for (i=1; i<=NF; i++) col_idx[$i] = i a_col = col_idx["A"] b_col = col_idx["B"] c_col = col_idx["C"] f_col = col_idx["F"] next } # 用A、B值拼接为唯一行键,暂存对应C、F列的值 row_key = $a_col "|" $b_col c_store[row_key] = $c_col f_store[row_key] = $f_col next } # 遍历第二个输入文件 { # 读取第二个文件的表头,记录各列实际位置 if (FNR == 1) { for (i=1; i<=NF; i++) col_idx[$i] = i a_col2 = col_idx["A"] b_col2 = col_idx["B"] d_col2 = col_idx["D"] e_col2 = col_idx["E"] # 输出固定顺序的合并表头 print "A\tB\tC\tD\tE\tF" next } # 匹配暂存的行键,取出对应C、F值,无匹配则置空 row_key = $a_col2 "|" $b_col2 c_val = c_store[row_key] ? c_store[row_key] : "" f_val = f_store[row_key] ? f_store[row_key] : "" # 按目标列顺序打印整行 print $a_col2 "\t" $b_col2 "\t" c_val "\t" $d_col2 "\t" $e_col2 "\t" f_val } ' file1.txt file2.txt > merged_output.txt
适配调整说明:
- 若文件为逗号分隔,将命令开头的
-F '\t'修改为-F ',',同时将打印输出中的\t替换为,即可 - 命令自动识别表头对应的列位置,即使两个文件中列的排列顺序不一致,也能正确取值
方案2:csvkit工具实现(适配带转义的复杂表格)
如果TXT文件为带引号转义、文本内嵌分隔符的类CSV格式,可通过系统包管理器安装csvkit工具集(Debian/Ubuntu执行apt install csvkit,RHEL/CentOS执行dnf install csvkit),通过内置工具链完成高容错合并:
# 提取第一个文件的目标列,暂存 csvcut -c A,B,C,F file1.txt > tmp_file1.tmp # 提取第二个文件的目标列 csvcut -c A,B,D,E file2.txt > tmp_file2.tmp # 按A、B列做关联合并,指定输出列顺序 csvjoin -c A,B tmp_file1.tmp tmp_file2.tmp | csvcut -c A,B,C,D,E,F > merged_output.txt
工具特点:
- 自动识别文本中的转义引号、内嵌分隔符,不会因表格内容干扰解析逻辑
- 追加参数
--outer可实现全外连接,保留两个文件中未互相匹配的所有行
内容的提问来源于stack exchange,提问作者Adi
相关产品推荐
相关产品推荐

