我熟悉awk程序中使用的函数split()。我想知道如何使用它将字符串拆分成长度为n的较小字符串?像(n设置为2)的东西:
输入:
abcdefgh
输出:
ab cd ef gh
答案 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指定 标准)。