技术需求:匹配两文件字段,将指定列内容追加至目标文件匹配行尾
匹配文件字段并追加内容的解决方案
看起来你需要实现的是跨文件字段匹配后追加内容的操作:将FILE1第一列的值与FILE2中对应字段匹配,成功时把FILE1的第三列追加到FILE2对应行的末尾。我给你整理了基于awk的实现方案,这是处理这类文本匹配任务最常用的工具之一。
示例文件参考
FILE1(逗号分隔,3列)
405869000009306,917010120346,3535080769880902 405869000013492,917010130771,8687780205056100 405869000014438,917010132781,8626280378318000
FILE2(逗号分隔,匹配字段为第7列,格式为=xxx)
9,=5|0|Pay,=,=,=1|1|918438953359,+918438953359@,=405869000009306,=20180304060000804+0530,=0,=0,=140,=0,=25,=0,=180304055956+22,=199,=1,=1,=-e-89-43-16-e367d-5a9b3e08-98b90,+918438953359@,=1|1|917019075052,=1|1|917010075000,=,=,=,=,=icid-value=14.137.67-1520123400.11094809;icid-generated-at;orig-ioi, 8,=1|1|918667657858,+918667657858@,=405869000013492,=1|1|919894455911,=,=,=20180304060000740+0530,=0,=1,=2,=0,=0,=0,=000000000000+00,=0,=1,=1,=1567756633_2338487864@2405:204:7a4e:2019:f339:d39b:1e12:915e,=sip:tn1ipsxm001.ims.mnc869.mcc405.3gppnetwork.org,=1|1|917010075000,=1|1|917010075009,mnc,=3GPP-E-UTRAN-FDD;405869006D039F831,=,=,=icid-value=11.274.6905-1520123400.57776869;icid-generated-at;orig-ioi,
期望输出(OUTPUT)
9,=5|0|Pay,=,=,=1|1|918438953359,+918438953359@,=405869000009306,=20180304060000804+0530,=0,=0,=140,=0,=25,=0,=180304055956+22,=199,=1,=1,=-e-89-43-16-e367d-5a9b3e08-98b90,+918438953359@,=1|1|917019075052,=1|1|917010075000,=,=,=,=,=icid-value=14.137.67-1520123400.11094809;icid-generated-at;orig-ioi,3535080769880902 8,=1|1|918667657858,+918667657858@,=405869000013492,=1|1|919894455911,=,=,=20180304060000740+0530,=0,=1,=2,=0,=0,=0,=000000000000+00,=0,=1,=1,=1567756633_2338487864@2405:204:7a4e:2019:f339:d39b:1e12:915e,=sip:tn1ipsxm001.ims.mnc869.mcc405.3gppnetwork.org,=1|1|917010075000,=1|1|917010075009,mnc,=3GPP-E-UTRAN-FDD;405869006D039F831,=,=,=icid-value=11.274.6905-1520123400.57776869;icid-generated-at;orig-ioi,8687780205056100
实现脚本(awk)
你可以直接用下面的awk命令完成任务,不需要额外编写复杂脚本:
awk 'BEGIN{FS=OFS=","} NR==FNR{map[$1]=$3;next} {key=$7;sub(/^=/,"",key);if(key in map) print $0,map[key];else print $0}' FILE1 FILE2 > OUTPUT
脚本逻辑解释
BEGIN{FS=OFS=","}:先设置输入和输出的字段分隔符都是逗号,确保处理前后的文件格式一致。NR==FNR{map[$1]=$3;next}:当处理第一个输入文件(FILE1)时,把每一行的第一列作为键,第三列作为值存入数组map,然后跳过后续操作继续读下一行。- 处理第二个文件(FILE2)时:
- 提取第7个字段(也就是包含
=xxx的匹配字段) - 用
sub(/^=/,"",key)去掉字段开头的=,得到和FILE1第一列一致的匹配键 - 如果这个键存在于
map数组中,就把原行和对应的值用逗号连接后打印;否则直接打印原行
- 提取第7个字段(也就是包含
运行这个命令后,结果会直接写入OUTPUT文件,和你期望的格式完全一致。
内容的提问来源于stack exchange,提问作者user2987869
相关产品推荐
相关产品推荐

