如何在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"