如何输出arrayfile元素在datafile中的匹配情况?求awk单行实现
用Awk单行命令实现匹配标记需求
嘿,这需求完全可以用Awk一行命令搞定,我给你写出来,再拆解下逻辑让你明白:
最终单行命令(适配arrayfile每行一个元素的场景)
NR==FNR{data=$0; next} {prefix=substr($0,1,length($0)-1); target=substr($0,length($0)); res=""; len=length(data)-length(prefix); for(i=1;i<=len;i++){if(substr(data,i,length(prefix))==prefix && substr(data,i+length(prefix),1)==target) res=res"1"; else res=res"0"} print $0, res} datafile arrayfile
如果你的arrayfile是同一行用空格分隔多个元素,可以用这个调整后的版本:
NR==FNR{data=$0; next} {n=split($0,arr," "); for(k in arr){prefix=substr(arr[k],1,length(arr[k])-1); target=substr(arr[k],length(arr[k])); res=""; len=length(data)-length(prefix); for(i=1;i<=len;i++){if(substr(data,i,length(prefix))==prefix && substr(data,i+length(prefix),1)==target) res=res"1"; else res=res"0"} print arr[k], res}} datafile arrayfile
命令逻辑拆解
我一步步给你说清楚每个部分做了什么:
- 读取datafile内容:
NR==FNR{data=$0; next}这部分会先把datafile的整个内容存到变量data里,然后跳过后续处理,直接切换到读取arrayfile。 - 处理arrayfile的每个元素:
- 提取前缀:
prefix=substr($0,1,length($0)-1)把当前元素去掉最后一个字符,得到要匹配的前缀字符串。 - 保存目标字符:
target=substr($0,length($0))把刚才去掉的最后一个字符单独存起来,用来后续验证匹配后的字符是否符合要求。
- 提取前缀:
- 生成01匹配串:
- 计算可匹配的最大位置:
len=length(data)-length(prefix)避免循环时超出data的内容范围。 - 循环遍历每个可能的匹配起始位置:检查当前位置的子串是否等于前缀,并且前缀后面紧邻的字符等于目标字符。满足条件就追加
1,否则追加0。
- 计算可匹配的最大位置:
- 输出结果:
print $0, res打印原元素和对应的01串,完全符合你要的格式。
验证你的测试案例
用你给出的测试数据跑第一个命令(假设arrayfile每行一个元素):
- arrayfile内容:
haha hahh - datafile内容:
aaahahahaaaahahahhaaahahahaaahahaaaa - 输出结果就是:
haha 1110111 hahh 0001000
完美匹配你的期望输出!
内容的提问来源于stack exchange,提问作者user289944
相关产品推荐
相关产品推荐

