2017-02-09 31 views
6

Предположим, я хочу передать строку в 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 

Есть ли awkism или gawkism, что позволило бы строке s быть непосредственно разделить на компоненты с этими компонентами становятся записями индекса в arr?


Причина заключается в том (большая картина), я хочу что-то вроде этого (псевдо AWK):

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

ответ

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

Я думаю, что 'Раскол (улица, TMP); для (i в tmp) arr [tmp [i]] ', вероятно, путь. Благодаря! – dawg

+0

, чтобы избежать отсутствия разделителя окружения * s * во втором решении. Я предлагаю это 'awk -vs =" A: B: C: G "~ ~ (^ | :)" $ 3 "(: | $)" {действие } '' – NeronLeVelu

+1

@NeronLeVelu Это превращает его в сравнение с регулярным выражением, поэтому вам нужно беспокоиться о метасимволах регулярных выражений в строках. В исходном коде использовалось сравнение строк ('$ 3 в arr'), а также код, который я разместил, используя' index() ', поэтому метасимволы regexp будут обрабатываться буквально. –

1

Вероятно бесполезным и излишне сложным, но я открою игру с while, match и substr :

Я очень хочу увидеть (если есть) некоторые полезные решения. Я пробовал играть с asort и так далее.

1

другим способом вида awkism

файл кошка

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