如何使用awk在单词的中间插入一些东西?

时间:2018-04-08 09:14:31

标签: 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的新手,我想知道这是不是正确的方式。

3 个答案:

答案 0 :(得分:3)

这可能是您正在寻找的内容:

$ 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

答案 1 :(得分:2)

假设您的要求是匹配包含def does_trouble_sort_work(A): B, C = A[0::2], A[1::2] B_sorted = sorted(B) C_sorted = sorted(C) j = k = 0 for i in xrange(len(A)): if i % 2 == 0: A[i] = B_sorted[j] j += 1 else: A[i] = C_sorted[k] k += 1 trouble_sort_works = True for i in xrange(1, len(A)): if A[i-1] > A[i]: trouble_sort_works = False break return trouble_sort_works 的列号并对其执行某些操作,请对列test进行简单循环,并使用正则表达式匹配运算符NF进行匹配或者对于固定字符串,将相等匹配为~

$i == "test"

这会产生预期的输出。请注意,我已awk ' { for(i=1;i<=NF;i++) { if ($i ~ "test") { halfLength=(length($i)/2) $i=(substr($i,1,halfLength) "SOMETHING" substr($i,(halfLength+1),halfLength)) } } }1' <<<"This is a test" 调用将字符串的第二部分打印为substr()。您需要substr($i,(halfLength+1),halfLength)才能错过。我已使用+1结果修改包含substr()的列号,即test

同样在执行$i=..时,每个列字段都会根据修改(如果有的话)重建,在我们的例子中只包含你想要的字符串。

另请注意,如果目标字符串包含奇数个字符或形成另一个较大字符串的子字符串,则整个尝试将失败(可以使用相等运算符,但正则表达式方法将失败)

答案 2 :(得分:1)

又一个从好奇心发展到个人仇杀的人(:

$ 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