2012-11-30 48 views
4

split()相反awk是什么? 想象一下,我有数组containsig字符/整数。awk与拆分相反

我已经试过:

color = "#FFFF00"; 
printf("color original: %s\n", color); 
split(color, chars, ""); 
joined = ""; 
for (i=1; i <= length(chars); i++) { 
    joined = joined + chars[i]; 
} 
printf("color joined: %s\n", joined); 

但是输出是:

color original: #FFFF00 
color joined: 0 

那当然是不正确的。

UPDATE: 凉,结束了下面的代码(通过加入目前在回答功能的启发):

color = "#FFFF00"; 
printf("color original: %s\n", color); 
split(color, chars, ""); 
joined = ""; 
for (i=1; i <= length(chars); i++) { 
    joined = joined "" chars[i]; 
} 
printf("color joined: %s\n", joined); 

的诀窍是不要加盟的事情,当回

+1

几件事情:'” “'在'加入'”字符[我]'上面没有做任何事情。虽然上面的方法可以用于数组中的单个字符,但这并不是一般的做法。像这样在数组上使用length()就是GNU-awk特有的。摆脱空声明(尾随分号)。 printf是一个带有'printf fmt,data'概要的内建函数,不是一个函数,所以printf(stuff)不会做你认为它的工作。我会发布一些简单的东西,但是在一般情况下,它可以做你想做的事情。 –

回答

1

明知的split()对面是join(),只有谷歌搜索给了我这个页面,这似乎包含了解决方案:http://www.gnu.org/software/gawk/manual/html_node/Join-Function.html。它将数组的所有元素连接在一起,并返回相应的字符串。

['f','o','o'] => "foo" 

玩得开心

+2

链接的页面指的是自己写一个函数。其中一个实际包含内联指令的答案应该被接受(gnu.org在撰写本文时已停用)。 –

0

使用+标志你想要的(在你的循环中)是string concatenation

+0

是正确的,但是我无法用我的代码来使用它,因为我不想直接打印,而是保持结果连接可变 –

8

下面是一个不依赖于GAWK或知道数组的长度,可以让你把一个分隔符(空间在这种情况下)字符串中的每个数组元素之间,如果你喜欢一个解决方案:

color = "#FFFF00" 
printf "color original: %s\n", color 
split(color, chars, "") 
joined = sep = "" 
for (i=1; i in chars; i++) { 
    joined = joined sep chars[i] 
    sep = " "  # populate sep here with whatever string you want between elements 
} 
printf "color joined: %s\n", joined 

我也清理了printf和虚假分号的不正确使用。

+0

你的加入会导致'sep'领先,除非你做了'joined = joined == sep?chars [i]:加入了sep chars [i]'no? – dawg

+0

@dawg不,试试吧。 –

+2

啊 - 对。'sep'是第一次通过。尼斯。 – dawg

4

使用了GNU AWK 4.1

#!/usr/bin/awk -f 
@include "join" 
BEGIN { 
    split("#FFFF00", chars, "") 
    print join(chars, 1, length(chars), SUBSEP) 
} 

awk save modifications in place

0

这里是POSIX awk中的方式:

br = "red,orange,yellow,green,blue" 
ch = split(br, de, ",") 
print "original: " br 
printf "joined: " 
for (ec in de) printf ec == ch ? de[ec] "\n" : de[ec] "-" 

输出:

original: red,orange,yellow,green,blue 
joined: red-orange-yellow-green-blue 
+0

对我来说,在FreeBSD的awk中,这个(1)需要在最后一行的inline条件附近加括号,并且(2)在换行符后面打印第一个字段。我认为失败是因为awk不能保证按顺序处理数组元素。改用'for(i = 1; i <= ch; i ++)'。 – ghoti