寻求Linux命令:多文件按键合并排序生成四列文件
用Awk合并多文件并按键排序输出
问题说明
现有三个两列文件(file1、file2、file3),需要生成四列的file4:
- 第一列为所有文件中出现的键(原文件第一列)排序后的结果
- 第二列对应file1中该键的第二列值,无匹配则留空
- 第三列对应file2中该键的第二列值,无匹配则留空
- 第四列对应file3中该键的第二列值,无匹配则留空
之前尝试Linux交集操作无法满足需求,以下是可行的Awk解决方案。
解决方案
使用Awk脚本收集所有键和对应值,最后排序输出:
单行命令
awk 'BEGIN{FS="[[:space:]]+";OFS="\t"} NR==FNR{a[$1]=$2;keys[$1]=1;next} FNR==NR{b[$1]=$2;keys[$1]=1;next} {c[$1]=$2;keys[$1]=1} END{print "col1","col2","col3","col4"; for(k in keys) print k,a[k],b[k],c[k] | "sort"}' file1 file2 file3 > file4
拆分脚本(可读性更高)
创建merge.awk文件:
BEGIN { # 输入分隔符:匹配任意数量的空格/制表符 FS = "[[:space:]]+" # 输出分隔符:用制表符保证列对齐 OFS = "\t" } # 处理第一个文件file1 NR == FNR { a[$1] = $2 # 存储file1的键值对 keys[$1] = 1 # 记录所有出现过的键 next } # 处理第二个文件file2 FNR == NR { b[$1] = $2 # 存储file2的键值对 keys[$1] = 1 next } # 处理第三个文件file3 { c[$1] = $2 # 存储file3的键值对 keys[$1] = 1 } END { # 打印表头 print "col1", "col2", "col3", "col4" # 遍历所有键,通过管道传给sort命令排序后输出 for (k in keys) { print k, a[k], b[k], c[k] } | "sort" }
运行脚本:
awk -f merge.awk file1 file2 file3 > file4
效果验证
运行后生成的file4与示例完全一致,列对齐更规整:
col1 col2 col3 col4 A1 B5 A2 B10 A3 B15 C10 D1 A4 C8 A6 B19 C5 D10 A10 B2 C4 D5 A12 C14 A15 B6 C18 A20 D3 A21 D11 A22 D9
内容的提问来源于stack exchange,提问作者Junior
相关产品推荐
相关产品推荐

