2014-09-23 229 views
2

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

输入:

abcdefgh 

输出:

ab cd ef gh 
+1

你问一个'分裂()'的解决方案,因为某种原因,你需要一个'分裂()'的解决方案或因为这是你认为将字符串拆分为子字符串会涉及到什么?有几种选择。 – 2014-09-23 22:46:19

回答

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 == “”

每个个体在记录中的字符rd将成为一个单独的 字段。 (这是徒劳无功的扩展;它不是由POSIX 标准规定。)

+2

我相信这是gawk特有的,只是为了记录。 – 2014-09-24 13:56:05

+1

@EtanReisner是的,使用空'FS'分割的'awk'行为在POSIX中是未定义的。 – 2014-09-24 15:24:49

2

如果你能拿出不出现的字符串,然后一个办法,分隔符像这样将工作:

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

您通常可以使用RS作为不能出现在字符串中的分隔符。由于输入在每次发生RS时被分割成记录,因此记录中不会有RS。获取多字符RSs虽然棘手。 – 2014-09-23 22:44:10

3

(g)awk分割功能是为了分割划上一个字符串ERS。它用由分隔符分隔的字段填充数组。既然你的字符串没有,你基本上想要分割字符串,你可以使用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 
+1

@EdMorton哈!我知道还有改进的余地! ':)'。 – 2014-09-23 22:49:49

+0

男人。我一直错过了所有酷炫的东西,因为我的日常工作是在CentOS 5上使用旧版本的东西。 =) – 2014-09-23 23:13:51

+0

@EtanReisner我听到你的声音。我在RHEL6上工作,也错过了它们。我打算建议'perl -MData :: Dumper -ne'@ ary = /(..)/g} {print Dumper \ @ary'<<<“abcdefgh”'但后来我意识到我在家并拥有最新版本便利! ':)' – 2014-09-24 00:03:36

6

既然你接受了一个非分割()解决方案,这里有一个这是不GAWK特异性,简短,并可能更快:-):

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

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

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

+1

+1 ..这比可接受的答案好得多。例如,如果您想将字符串分成50或100个长度段。 – 2016-12-30 03:46:57

2

如何:

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