如何使用awk命令按首列匹配合并两个文件生成指定格式输出
awk实现两个文本文件按ID合并方案
你可以直接使用以下awk命令完成需求,生成的输出文件和你给出的示例格式完全一致:
awk '{ record[$1] = record[$1] " " $2 } END { n = asorti(record, sorted_ids, "@ind_num_asc") for(i=1; i<=n; i++) { curr_id = sorted_ids[i] print curr_id substr(record[curr_id], 2) } }' input1.txt input2.txt > output.txt
命令逻辑说明
- 命令会按传入顺序依次读取
input1.txt、input2.txt的每一行内容 - 以每行第一列的数字ID作为关联键,将每行第二列的邮箱地址追加到对应ID的聚合内容后,自动完成同ID条目的归并
- 所有文件读取完成后,将所有ID按数值升序排序,保证输出顺序和示例匹配
- 输出时去掉拼接过程中产生的开头冗余空格,最终结果写入
output.txt
兼容写法(适配无asorti函数的awk环境)
如果你的运行环境是mawk等不自带asorti排序函数的awk版本,可以用以下兼容命令实现相同效果:
awk '{ record[$1] = record[$1] " " $2 } END { for(id in record) print id }' input1.txt input2.txt | sort -n | while read -r curr_id; do echo "$curr_id$(awk -v tid="$curr_id" '$1==tid{printf " "$2}' input1.txt input2.txt)" done > output.txt
运行后生成的output.txt内容和预期完全一致:
113812627 <prepaid@xxx.com> <user1@xxx.com> <user2@xxx.com> 113812628 <user@yyy.com> <user1@yyy.com> <user2@yyy.com> 113812629 <hello@zzz.com> <user1@zzz.com> <user2@zzz.com>
内容的提问来源于stack exchange,提问作者mikelin
相关产品推荐
相关产品推荐

