![awk 部分字符串匹配](https://linux22.com/image/165645/awk%20%E9%83%A8%E5%88%86%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%B9%E9%85%8D.png)
因此,我尝试部分匹配一个字段中的字符串,然后将该字段与单独文件中的另一个字段一起使用,
输入示例 -
输入1.txt:
example/world
example/forever
输入2.txt
example123
example234
预期输出.txt:
example123/world
example234/world
example123/forever
example234/forever
所以基本上使用 AWK 将 input1.txt 分成 2 个字段,使用 -
awk -F"/"
这意味着第一行 $1 是example
,$2 是world
然后,它通过部分匹配 input2.txt 中的 $1 来检查 input2.txt 是否包含example
,然后找到这些匹配项并将它们与 input1 的 $2 组合。
答案1
awk -v file2="input2.txt" -F'/' '{
while ((getline line < file2) > 0){
if (line ~ "^"$1) print line FS $2
}
close(file2)
}' input1.txt
这基本上就是你所描述的。对于input1.txt
所有行中的每一行,input2.txt
都会读取并与 的开头进行比较$1
。如果匹配,input2.txt
则打印 的行并带有分隔符/
和$2
。
答案2
这是部分字符串匹配的方法:
$ cat tst.awk
BEGIN { FS=OFS="/" }
NR==FNR {
strings[$1]
next
}
{
for (string in strings) {
if ( index(string,$1) ) {
print string, $2
}
}
}
$ awk -f tst.awk input2.txt input1.txt
example234/world
example123/world
example234/forever
example123/forever
如果您只想在字符串开头匹配,则只需将其更改index(...)
为index(...) == 1
.
答案3
awk
基于提供的示例文件的另一个解决方案:
$ cat demo.awk
BEGIN { FS="/"; while ((getline < "input2.txt" ) > 0 ) { s[i++] = $0 } }
{ for (i in s)
if (s[i] ~ "^"$1) { print s[i] FS $2 }
# alternative tests
# if (index(s[i], $1)) { print s[i] FS $2 }
# if (index(s[i], $1) == 1) { print s[i] FS $2 }
}
输出:
$ awk -f demo.awk input1.txt
example123/world
example234/world
example123/forever
example234/forever
$