我怎么才能用AWK在单词中间插入一些东西呢?

我怎么才能用AWK在单词中间插入一些东西呢?,awk,gawk,Awk,Gawk,我有一个意见: This is a test 我想在单词中间插入一些字母,比如: This is a teSOMETHINGst 我知道我可以用$I来定义所需的单词,但是我如何才能这样修改这个单词呢 我试着这样做: { i=4 # finding somehow print (substr($i,1,(length($i)/2)) "SOMETHING" substr($i,(length($i)/2),(length($i)/2))) } 由于我是awk新手,我想知道这是

我有一个意见:

This is a test
我想在单词中间插入一些字母,比如:

This is a teSOMETHINGst
我知道我可以用$I来定义所需的单词,但是我如何才能这样修改这个单词呢

我试着这样做:

{
    i=4 # finding somehow
    print (substr($i,1,(length($i)/2)) "SOMETHING" substr($i,(length($i)/2),(length($i)/2)))
}

由于我是awk新手,我想知道这是否是一种正确的方法。

假设您的要求是匹配包含test的列号并对其执行一些操作,在列上执行一个简单的循环,直到NF,然后使用regex match操作符~进行匹配,或者对固定字符串执行相等匹配,如$I==test

这将产生预期的输出。请注意,我已经发出了substr调用,将字符串的第二部分打印为substr$I,half-length+1,half-length。需要+1,这是您以前错过的。我已经使用substr结果来修改包含测试的列号,即$I=

此外,在执行{..}1时,每个列字段都将基于修改(如果有)进行重构,在我们的示例中,仅对包含所需字符串的列进行重构


还请注意,如果目标字符串包含奇数个字符或形成另一个较大字符串的子字符串,则整个尝试将失败。如果您的要求是匹配包含测试的列号并对其执行一些操作,则可以使用相等运算符,但正则表达式方法将失败,使用regex match操作符~在列上执行一个简单的循环,直到NF,然后进行匹配,或者对固定字符串执行相等匹配,如$i==test

这将产生预期的输出。请注意,我已经发出了substr调用,将字符串的第二部分打印为substr$I,half-length+1,half-length。需要+1,这是您以前错过的。我已经使用substr结果来修改包含测试的列号,即$I=

此外,在执行{..}1时,每个列字段都将基于修改(如果有)进行重构,在我们的示例中,仅对包含所需字符串的列进行重构


还请注意,如果目标字符串包含奇数个字符或形成另一个较大字符串的子字符串,则整个尝试将失败。可以使用相等运算符,但正则表达式方法将失败。这可能是您正在寻找的:

$ awk 'match($0,/\<test\>/){mid=int(RLENGTH/2); $0=substr($0,RSTART,mid) "SOMETHING" substr($0,RSTART+mid,RELNGTH-mid)} 1'
e、 g.某些测试用例没有双关语:

$ echo 'This is a test' |
awk 'match($0,/\<test\>/){mid=int(RLENGTH/2); $0=substr($0,RSTART,mid) "SOMETHING" substr($0,RSTART+mid,RLENGTH-mid)} 1'
teSOMETHINGst

$ echo 'These are tests' |
awk 'match($0,/\<tests\>/){mid=int(RLENGTH/2); $0=substr($0,RSTART,mid) "SOMETHING" substr($0,RSTART+mid,RLENGTH-mid)} 1'
teSOMETHINGsts

$ echo 'These contestants are in a test' |
awk 'match($0,/\<test\>/){mid=int(RLENGTH/2); $0=substr($0,RSTART,mid) "SOMETHING" substr($0,RSTART+mid,RLENGTH-mid)} 1'
teSOMETHINGst

这可能是您正在寻找的:

$ awk 'match($0,/\<test\>/){mid=int(RLENGTH/2); $0=substr($0,RSTART,mid) "SOMETHING" substr($0,RSTART+mid,RELNGTH-mid)} 1'
e、 g.某些测试用例没有双关语:

$ echo 'This is a test' |
awk 'match($0,/\<test\>/){mid=int(RLENGTH/2); $0=substr($0,RSTART,mid) "SOMETHING" substr($0,RSTART+mid,RLENGTH-mid)} 1'
teSOMETHINGst

$ echo 'These are tests' |
awk 'match($0,/\<tests\>/){mid=int(RLENGTH/2); $0=substr($0,RSTART,mid) "SOMETHING" substr($0,RSTART+mid,RLENGTH-mid)} 1'
teSOMETHINGsts

$ echo 'These contestants are in a test' |
awk 'match($0,/\<test\>/){mid=int(RLENGTH/2); $0=substr($0,RSTART,mid) "SOMETHING" substr($0,RSTART+mid,RLENGTH-mid)} 1'
teSOMETHINGst

另一个从好奇发展到个人仇杀:

$ echo This is a contestant test | 
awk -v s="test" '
BEGIN {
    FS=OFS=""
}
{
    if(i=match($0, "(^| )" s "( |$)")) {   # match over index since regex support
        j=(i+length(s)/2+!!(i-1))          # !!(i-1) detect beginning of record
        $j="SOMETHING" $j
    }
}1'
This is a contestant teSOMETHINGst
另一个使用空分隔符,主要是为了满足个人好奇心:

$ echo This is a test | 
awk -v s="test" '
BEGIN {
    FS=OFS=""                # empty separators
}
{
    if(i=index($0,s)) {      # index finds the beginning of test
        j=(i+length(s)/2)    # midpoint
        $j="SOMETHING" $j    # insert string
    }
}1'                          # output
This is a teSOMETHINGst

另一个从好奇发展到个人仇杀:

$ echo This is a contestant test | 
awk -v s="test" '
BEGIN {
    FS=OFS=""
}
{
    if(i=match($0, "(^| )" s "( |$)")) {   # match over index since regex support
        j=(i+length(s)/2+!!(i-1))          # !!(i-1) detect beginning of record
        $j="SOMETHING" $j
    }
}1'
This is a contestant teSOMETHINGst
另一个使用空分隔符,主要是为了满足个人好奇心:

$ echo This is a test | 
awk -v s="test" '
BEGIN {
    FS=OFS=""                # empty separators
}
{
    if(i=index($0,s)) {      # index finds the beginning of test
        j=(i+length(s)/2)    # midpoint
        $j="SOMETHING" $j    # insert string
    }
}1'                          # output
This is a teSOMETHINGst

当目标字符串为奇数字符时(例如测试),当目标单词是另一个单词的一部分时(例如。contestant@EdMorton:当然,艾德!我知道,只是想修正OP的企图。将添加您提到的案例的注释。@EdMorton:完成Ed!现在他们看到我的答案后会直接跳到你的;当目标字符串为奇数字符时(例如测试),当目标单词是另一个单词的一部分时(例如。contestant@EdMorton:当然,艾德!我知道,只是想修正OP的企图。将添加您提到的案例的注释。@EdMorton:完成Ed!现在他们看到我的答案后会直接跳到你的;这将错误地发现测试,如果它是在参赛者。它还依赖于未定义的行为,awk对FS=的处理是POSIX未指定的,所以YMMV。当然会,根本不是锅炉板的证明。我只是对测试这个方案感兴趣。同样令人惊讶的是,它也能与mawk和original awk一起工作。是的,这太糟糕了,没有办法说查找这个字符串不在另一个字符串中,但在这条路上存在可怕的p语法爆炸,因此我们必须编写类似于i=index$0,s&&i==1| substr$0,i-1,1!~/[[:alpha:]/&&i+length==length$0 | | substr$0,i+length,1!~/[[:alpha:][]/此外,如果参赛者在测试之前就被淘汰了,因为第一次命中没有循环。从一开始就注定了。一个人有多少种失败的方式?在句子的开头加上盐,然后把盐放在i>1的位置上-好的,明白了,谢谢你的解释。如果测试在参赛者的范围内,这将错误地找到测试。它还依赖于未定义的行为,awk对FS=的处理是POSIX未指定的,所以YMMV。当然会,根本不是锅炉板的证明。我只是对测试这个方案感兴趣。同样令人惊讶的是,它也能与mawk和original awk一起工作。是的,这太糟糕了,没有办法说查找这个字符串不在另一个字符串中,但在这条路上存在可怕的p语法爆炸,因此我们必须编写类似于i=index$0,s&&i==1| substr$0,i-1,1!~/[[:alpha:]/&&i+length==length$0 | | substr$0,i+length,1!~/[[:alpha:][]/此外,如果参赛者在测试之前就被淘汰了,因为第一次命中没有循环。命中注定 e开始。一个人有多少种失败的方式?在句子的开头加上盐,这样它就代替了i>1-好的,明白了,谢谢你的解释。