Сохранение вывода awk (поиск по индексу) в переменной оболочки (кроме возвращаемого значения) - PullRequest
0 голосов
/ 27 ноября 2018

Рассмотрим следующий сценарий:

echo 52=abcd_53=1_54=efgh_55=ijkl | awk -v time_tag="52=" -v start_time="54=" -v end_time="55=" '{p=index($0, time_tag)} {q=index($0, start_time)} {r=index($0, end_time)} /53=1/'

Я хотел бы получить значения p, q, r в переменных оболочки, чтобы их можно было использовать после выполнения вышеуказанной команды.Я не могу использовать массив оболочки, так как моя конечная цель примерно такая:посчитайте, что если я просто получу индексы в самой строке awk, программа может работать значительно быстрее (для миллионов строк), поскольку время является узким местом.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Ваш вопрос немного неясен, но из вашего оригинального сценария я предполагаю, что следующий ввод

52=abcd_53=1_54=efgh_55=ijkl

должен возвращать следующий вывод:

52=abcd,54=efgh,55=ijkl

Если это вашконечная цель, тогда вы можете просто сделать следующее awk:

awk 'BEGIN{FS="[_=]";OFS=","}
     { for(i=1;i<NF;i+=2) a[$i]=$i"="$(i+1)
       if(a[53]==1) print a[52],a[54],a[55]
       delete a
     }' file

Это, конечно, предполагает, что все ваши строки выглядят так:

Если вы хотите обработать что-то вроде этого,с помощью bash-скрипта вы можете обработать этот вывод напрямую с помощью цикла while

awk '{...}' file | while IFS=, read -r time_tag start_time end_time; do
   do what you want to do
done

Если вы хотите иметь быстрое выполнение, то сделайте все с помощью awk и перенаправьте его вывод в ваш bash-loop:

0 голосов
/ 27 ноября 2018

кроме возвращаемого значения - нет, но как насчет того, чтобы избавиться от этих бесполезных cat и:

$ cat file
52=abcd_53=1_54=efgh_55=ijkl
$ for i in file
  do 
    ret=$(awk -v time_tag="52=" -v start_time="54=" -v end_time="55=" '{p=index($0, time_tag)} {q=index($0, start_time)} {r=index($0, end_time)} /53=1/{print p,q,r}' "$i")
    read -r -a array <<< "$ret"
  done
$ echo ${array[0]}
1
$ echo ${array[1]}
14
$ echo ${array[2]}
22

В конце часть awk немного изменилась:

awk -v time_tag="52=" -v start_time="54=" -v end_time="55=" '{
    p=index($0, time_tag)
} 
{
    q=index($0, start_time)
} 
{
    r=index($0, end_time)
} 
/53=1/ {
    print p,q,r  # added this and the brackets around this
}' $i

Теперь awk выводит:

1 14 22

, что является делением пространства на array с read.

Не зная, что находится в файлах и как выглядит ожидаемый результат, я не могу сделать больше (т.е. переписать его полностью в awk).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...