将字符串直接拆分为数组

时间:2017-02-09 20:44:06

标签: arrays awk gawk

假设我想将一个字符串传递给awk,这样一旦我将其拆分(在模式上),子字符串就会成为关联数组的索引(而不是值)。

像这样:

$ awk -v s="A:B:F:G" 'BEGIN{ # easy, but can these steps be combined?
                            split(s,temp,":")  # temp[1]="A",temp[2]="B"...
                            for (e in temp) arr[temp[e]] #arr["A"], arr["B"]...
                            for (e in arr) print e 
                            }'
A
B
F
G

是否存在允许字符串s直接拆分为其组件的awkism或gawkism,这些组件成为arr中的索引条目?

原因是(更大的图片)我想要这样的东西(伪awk):

awk -v s="1,4,55" 'BEGIN{[arr to arr["1"],arr["5"],arr["55"]} $3 in arr {action}'

3 个答案:

答案 0 :(得分:3)

不,没有更好的方法将分离的子串映射到数组索引而不是:​​

split(str,tmp); for (i in tmp) arr[tmp[i]]

FWIW如果您不喜欢这种方法来执行最终的伪代码:

awk -v s="1,4,55" 'BEGIN{split(s,tmp,/,/); for (i in tmp) arr[tmp[i]]} $3 in arr{action}'

然后另一种获得相同行为的方法是

awk -v s=",1,4,55," 'index(s,","$3","){action}'

答案 1 :(得分:1)

可能无用且不必要的复杂,但我会用whilematchsubstr打开游戏:

$ awk -v s="A:B:F:G" '
BEGIN {
    while(match(s,/[^:]+/)) {
        a[substr(s,RSTART,RLENGTH)]
        s=substr(s,RSTART+RLENGTH)
    }
    for(i in a)
        print i
}'
A
B
F
G

我渴望看到(如果有的话)一些有用的解决方案。我尝试过使用asort等等。

答案 2 :(得分:1)

其他方式awkism

  

cat file

1 hi
2 hello
3 bonjour
4 hola
5 konichiwa

运行它,

awk 'NR==FNR{d[$1]; next}$1 in d' RS="," <(echo "1,2,4") RS="\n" file

你明白了,

1 hi
2 hello
4 hola