Awk--将字符串拆分为长度为n的子字符串

时间:2014-09-23 21:51:46

标签: awk

我熟悉awk程序中使用的函数split()。我想知道如何使用它将字符串拆分成长度为n的较小字符串?像(n设置为2)的东西:

输入:

abcdefgh

输出:

ab cd ef gh

5 个答案:

答案 0 :(得分:8)

由于您接受了非split()解决方案,因此这是一个非gawk特定的,简短的,可能更快的解决方案: - ):

$ awk '{gsub(/.{2}/,"& ")}1' file
ab cd ef gh

$ awk '{gsub(/.{3}/,"& ")}1' file
abc def gh

就像您接受的基于循环的那个一样,当输入字符串是您想要分割的字符数的精确倍数时,它会添加一个尾随空白字符。

答案 1 :(得分:3)

(g)awk中的分割函数用于在分隔符上分割字符串。它使用由分隔符分隔的字段填充数组。由于您的字符串没有,并且您基本上希望将字符串拆分为块,因此您可以使用awk的GNU split功能,该功能还会基于分隔符创建可选数组。

gawk 'BEGIN {
    n = split ("abcdefgh", ary, /../, seps);
    for (i=1; i<=n; i++) 
       printf "%s%s", seps[i], (i<n?FS:RS)
}'
ab cd ef gh 

答案 2 :(得分:2)

如果你能想出一个没有出现在字符串中的分隔符,那么这样的方法就可以了:

awk 'BEGIN {f="abcdefgh"; gsub(/../, "& ", f); split(f, a, FS); print a[1],a[2],a[3],a[4]}'

答案 3 :(得分:2)

这个怎么样:

echo "abcdefgh" | awk 'BEGIN {ORS=" "}{for (i=1;i<=length($0);i+=2) print substr( $0, i, 2 )}'

答案 4 :(得分:1)

使用gawk您也可以:

$ echo 'abcdefgh' | awk -F '' '{ for(i=1; i<=NF; i+=2) {printf "%s%s ", $i,$(i+1);}}'
ab cd ef gh 

来自gawk manual

  

FS ==&#34;&#34;

     

记录中的每个字符都是独立的   领域。 (这是一个gawk扩展;它没有由POSIX指定   标准)。