awk 部分字符串匹配

awk 部分字符串匹配

因此,我尝试部分匹配一个字段中的字符串,然后将该字段与单独文件中的另一个字段一起使用,

输入示例 -

输入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
$

相关内容