2013-02-11 82 views
1

我使用awk substr()从字符串中提取子字符串。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))}' 

有没有更简单的方法?

+5

的SUBSTR的值分配给一个变量,然后重复打印变量?祝你好运。 – shellter 2013-02-11 18:34:12

回答

0

这是解决这种问题的方法之一(凌乱但有效)。

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

qweyuioyuioyuio 
1

有一个delightful post解释在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表示此参数被用作临时局部变量。

2

只要你想提取不相重叠的子串,你可以使用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

+0

就我个人而言,我认为你的第一个条款是一个交易断路器。 FIELDWIDTHS应该只用于固定宽度的数据处理。 – Steve 2013-02-11 23:50:01

+0

如果数据是由固定宽度的字段组成的,那么这尤其适合...如果要读取的数据不重叠,则最好使用多个substr()。 – 2013-02-12 20:40:16

1

是的。您可以简单地将子字符串保存到变量中,然后根据需要重新打印。不要忘记设置一个空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