2

我正在使用awk substr()从字符串中提取子字符串。

例如,如果我的字符串如下所示:

qwertyuiop

我想提取 (1-3) & (6-9) 字符我用这个:

awk '{print (substr($1, 1, 3) substr($1, 6, 4))}'  
qweyui

如何多次重复特定的减法?

例如,我想提取 (1-3) & (6-9)(6-9)(6-9) 字符以获得如下结果:

qweyuioyuioyuio

当然我可以使用这样的命令:

awk '{print (substr($1, 1, 3) substr($1, 6, 4) substr($1, 6, 4) substr($1, 6, 4))}'

有没有更简单的方法?

4

4 回答 4

3

如果你想提取不重叠的子字符串,你可以使用 gawk 的固定列宽选项:

echo "qwertyuiop" | gawk -v FIELDWIDTHS="3 2 4" '{ print $1 $3 $3 $3 }'

您定义 3 列。第一个是 3 个字符宽(这与 substr($1, 1, 3) 相同)。第二个是 2 个字符宽(我们将忽略它)。第三个是您的第二个子字符串 (substr($1, 6, 4))。

您可以直接打印您定义的字段。

https://www.gnu.org/software/gawk/manual/gawk.html#Constant-Size

于 2013-02-11T22:54:44.093 回答
1

有一篇令人愉快的帖子解释了在 awk 中重复字符串的各种方法。

我将引用最明显的:

function rep1(s,n,      r) {
# O(n) allocate/appends
# 2 lines of code
# This is the simplest possible solution that will work:
# just repeatedly append the input string onto the value
# that will be passed back, decrementing the input count
# until it reaches zero.
        while (n-->0) r = r s;
        return r;
}

PS:函数参数前的大空间awk表示该参数用作临时局部变量。

于 2013-02-11T18:59:36.467 回答
1

是的。您可以简单地将子字符串保存到变量中,然后根据需要重新打印。不要忘记设置一个 null OFS

awk '{ print substr($1, 1, 3), x = (substr($1, 6, 4)), x, x }' OFS=

测试:

echo "qwertyuiop" | awk '{ print substr($1, 1, 3), x = (substr($1, 6, 4)), x, x }' OFS=

结果:

qweyuioyuioyuio

如果您需要打印超过三到四次的内容,则可能值得使用for循环:

echo "qwertyuiop" | awk '{ for(i=1;i<=5;i++) x = x substr($1, 6, 4); print substr($1, 1, 3), x }' OFS=

结果:

qweyuioyuioyuioyuioyuio
于 2013-02-11T23:33:06.620 回答
0

这是此类问题的解决方案之一(混乱但有效)。

 echo qwertyuiop | awk '{m=substr($1, 6, 4); {while (count++<3) string=string m; 
 print substr($1, 1, 3) string}}' 

 qweyuioyuioyuio
于 2013-02-11T20:24:18.083 回答