我正在使用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))}'
有更简单的方法吗?
答案 0 :(得分: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
答案 1 :(得分: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 :(得分: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
答案 3 :(得分:0)
这是解决这个问题的方法之一(凌乱但有效)。
echo qwertyuiop | awk '{m=substr($1, 6, 4); {while (count++<3) string=string m;
print substr($1, 1, 3) string}}'
qweyuioyuioyuio