如何在awk中将字段拆分为字符?

如何在awk中将字段拆分为字符?,awk,Awk,我想检查一个字段中的两个字段是否有公共字符 first second // looking for "s" third fourth // looking for "t" or "h" or "r" some that 我只想打印字段中至少有一个公共字符的前两行 我把字段读作 awk 'BEGIN{FS=" ";} CONDITION {print $0}' file.txt 在这种情况下,我需要将一个字段拆分为字符,并检查它们在另一个字段中是否存在 // for $1 BEGIN{FS="

我想检查一个字段中的两个字段是否有公共字符

first second // looking for "s"
third fourth // looking for "t" or "h" or "r"
some that
我只想打印字段中至少有一个公共字符的前两行

我把字段读作

awk 'BEGIN{FS=" ";} CONDITION {print $0}' file.txt
在这种情况下,我需要将一个字段拆分为字符,并检查它们在另一个字段中是否存在

// for $1
BEGIN{FS=""}
  { i=0; while(i<=NF) {
   CHECK in $2; i++;
  } print $0 }
//1美元
开始{FS=”“}

{i=0;而(i您可以使用此正则表达式:

awk 'NF>=2 {
   s = $1
   p = $2
   gsub(/[^[:alnum:][:blank:]_]/, "\\\\&", p)
   sub("[" p "]", "", s)
}
s != $1' file


这里我们使用
sub
函数生成一个括号表达式,即
[…]
,其中
..
$2
,然后从
$1
中删除这些字符。如果
$1
不等于
s
(保存的
$1
值)然后,前两个字段之间仍然有一个公共字符。

您可以使用此正则表达式:

awk 'NF>=2 {
   s = $1
   p = $2
   gsub(/[^[:alnum:][:blank:]_]/, "\\\\&", p)
   sub("[" p "]", "", s)
}
s != $1' file


这里我们使用
sub
函数生成一个括号表达式,即
[…]
,其中
..
$2
,然后从
$1
中删除这些字符。如果
$1
不等于
s
(保存的
$1
值)然后前两个字段之间仍然有一个公共字符。

可以使用简单的实现

$ awk '{for(i=1;i<=length($1);i++) 
          if(index($2,substr($1,i,1))) 
            {print; next}}' file

first second
third fourth

$awk'{for(i=1;i一个简单的实现可以是

$ awk '{for(i=1;i<=length($1);i++) 
          if(index($2,substr($1,i,1))) 
            {print; next}}' file

first second
third fourth
$awk'{for(i=1;i
$cat tst.awk
{
删除字符
对于(i=1;i
$cat tst.awk
{
删除字符

对于(i=1;iI得到了你的方法,但它有两个问题:(i)匹配字符从输出中删除(你的输出也是如此),(iI)如果我们有一个非法字符,比如
-
,正则表达式就会中断。我得到了你的方法,但它有两个问题:(i)匹配字符从输出中删除(在您的输出中也是如此),(ii)如果我们有一个非法字符,如
-
split($1,f,“”)
在POSIX中是未定义的行为,则正则表达式将中断。它将在GNU awk中执行您想要的操作,但在其他一些awk中不会执行。第一个脚本简洁、可移植且健壮-很好!
split($1,f,”)
是POSIX中未定义的行为。它将在GNU awk中实现您想要的功能,但在其他一些awk中却无法实现。第一个脚本简洁、可移植且健壮-很好!
$ cat tst.awk
{
    delete chars
    for (i=1; i<=length($1); i++) {
        chars[substr($1,i,1)]
    }
    for (i=1; i<=length($2); i++) {
        if (substr($2,i,1) in chars) {
            print
            next
        }
    }
}

$ awk -f tst.awk file
first second // looking for "s"
third fourth // looking for "t" or "h" or "r"