求助:使用Awk匹配两个文件并输出指定结果
解决FILE2与FILE1拼接列匹配的Awk方案
哇,卡了4天确实够闹心的!别慌,咱们把这个需求拆解开,用Awk应该几行代码就能搞定。
先明确下核心需求:我们要拿FILE2的第1列,去匹配FILE1里第4列和第5列拼接起来的字符串,匹配成功后输出对应的名称数据(这里默认你要输出的是FILE1的第1列,如果是其他列,后面可以调整)。
先给个示例数据方便理解
假设你的FILE1内容是(用逗号分隔,其他分隔符也一样处理):
Alice,28,Engineer,NY,001 Bob,32,Designer,LA,002 Charlie,25,Developer,CHI,003
FILE2内容是:
NY001 CHI003
我们要匹配到NY001(FILE1的$4+$5)和CHI003,然后输出Alice和Charlie。
核心Awk命令
直接用这个命令就能实现:
awk 'NR==FNR {key[$1]; next} ($4$5 in key) {print $1}' FILE2 FILE1
逐行解释下命令逻辑
NR==FNR:这是Awk里处理多文件的经典写法——当处理第一个输入文件(这里是FILE2)时,全局行号NR等于当前文件行号FNR,这个条件成立。key[$1]; next:把FILE2每一行的第1列存入数组key(键就是FILE2的第1列值),然后next跳过后面的代码,直接处理下一行。($4$5 in key):处理第二个文件(FILE1)时,把第4列和第5列拼接成一个字符串,检查这个字符串是不是在key数组里(也就是有没有在FILE2里出现过)。print $1:如果匹配成功,就输出FILE1的第1列(也就是你要的名称数据,要是需要输出其他列,把$1改成对应的列号就行,比如$1,$2输出前两列)。
适配不同分隔符的情况
如果你的文件是用逗号、制表符等分隔的,需要用-F指定分隔符,比如逗号分隔的话:
awk -F',' 'NR==FNR {key[$1]; next} ($4$5 in key) {print $1}' FILE2 FILE1
额外处理:去除列的前后空格
如果FILE1的第4/5列或者FILE2的第1列前后有多余空格,会导致匹配失败,这时候可以先去除空格:
awk ' NR==FNR { gsub(/^[[:space:]]+|[[:space:]]+$/,"",$1) # 去除FILE2第1列的前后空格 key[$1] next } { gsub(/^[[:space:]]+|[[:space:]]+$/,"",$4) # 去除FILE1第4列的前后空格 gsub(/^[[:space:]]+|[[:space:]]+$/,"",$5) # 去除FILE1第5列的前后空格 if ($4$5 in key) print $1 }' FILE2 FILE1
要是还有特殊情况(比如拼接需要加分隔符?或者输出格式有要求),随时说,咱们再调整!
内容的提问来源于stack exchange,提问作者ya801
相关产品推荐
相关产品推荐

