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

Awk——将字符串拆分为长度为n的子字符串,awk,Awk,我熟悉awk程序中使用的函数split()。我想知道如何使用它将字符串拆分为长度为n的较小字符串?类似于(n设置为2): 输入: abcdefgh 输出: ab cd ef gh 如果您能想出一个不出现在字符串中的分隔符,那么类似的方法将起作用: awk 'BEGIN {f="abcdefgh"; gsub(/../, "& ", f); split(f, a, FS); print a[1],a[2],a[3],a[4]}' (g)awk中的Split函数用于在分隔符上拆分字符串

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

输入:

abcdefgh
输出:

ab cd ef gh

如果您能想出一个不出现在字符串中的分隔符,那么类似的方法将起作用:

awk 'BEGIN {f="abcdefgh"; gsub(/../, "& ", f); split(f, a, FS); print a[1],a[2],a[3],a[4]}'
(g)awk
中的Split函数用于在分隔符上拆分字符串。它使用由分隔符分隔的字段填充数组。由于您的字符串没有,并且您基本上希望将字符串分割成块,因此可以使用
split
的GNU
awk
功能,该功能还基于分隔符创建可选数组

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 
gawk'开始{
n=拆分(“abcdefgh”,ary,///,seps);

对于(i=1;i,因为您接受了一个非split()解决方案,这里有一个非特定于gawk、更简洁、可能更快的解决方案:-):

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

这样如何:

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

echo“abcdefgh”| awk'BEGIN{ORS=”“}{for(i=1;i使用
gawk
您还可以执行以下操作:

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

$echo'abcdefgh'| awk-F''{for(i=1;iYou通常可以使用RS作为不能出现在字符串中的分隔符。由于输入在每次出现RS时都被拆分为记录,因此记录中不能有RS。不过,使用多字符RSs会变得更复杂。您是否要求使用
split()
解决方案,因为出于某种原因,您需要一个
split()
解决方案,或者因为您认为将字符串拆分为子字符串将涉及到这一点?有几种选择。@EdMorton Ha!我知道还有改进的余地!
:)
.Man.我一直在错过所有很酷的东西,因为我的日常工作是在CentOS 5上进行的,有它的旧版本。=)@EtanReisner我听到了。我在RHEL6上工作,也错过了它们。我打算建议
perl-MData::Dumper-ne'@ary=/(…)/g}{print Dumper\@ary'我相信这是特定于gawk的,只是为了记录。@EtanReisner是的,
awk
使用empty
FS
进行拆分的行为在POSIX中是未定义的。+1..这比公认的答案缩放效果要好得多;例如,如果您想将字符串拆分为50或100个长度段。此外,如果您想将一条长线拆分为固定长度的线段-例如,将
{2}
更改为
{64}
,并用
“&\n”
替换
”&“
”-便于重新格式化那些损坏的SSH或GPG密钥,只需记住先去掉文本
\n
字符!
$ echo 'abcdefgh' | awk -F '' '{ for(i=1; i<=NF; i+=2) {printf "%s%s ", $i,$(i+1);}}'
ab cd ef gh