awk armazena um resultado de padrão para uma variável de matriz de shell

3

Estou tentando armazenar o resultado de um padrão correspondido por awk a uma variável de matriz de shell. Aqui está um exemplo simplificado do mesmo:

#!/bin/bash
declare -a array1=()
declare -a array2=()
READ_FILE="directory1/read_file.csv"
WRITE_FILE="directory2/results.csv"

#variable for counting array index
count1=0
count2=0
#
#
# need help with line below
#  below is the second set of characters which is a floating point number
awk -F 'string1_to_search' '{$array1[count1++] = }' $READ_FILE >> $WRITE_FILE
awk -F 'string2_to_search' '{$array2[count1++] = }' $READ_FILE >> $WRITE_FILE
#count++ indicates post increment of count variable

qualquer sugestão seria útil.

    
por gajendra 07.01.2018 / 17:11

1 resposta

3

Você não pode gravar em variáveis Bash de dentro de awk .

O que você deve fazer é fazer com que awk imprima tudo o que deseja armazenar na matriz, um item por linha e, em seguida, use o Bash built-in mapfile para lê-lo em uma matriz:

mapfile -t array1 < <( awk -F 'string1_to_search' '{print }' "$READ_FILE" )

Depois disso, sua matriz está em $array1 . Você também não precisa declare de antemão, mapfile faz isso para você.

Mais informações sobre mapfile podem ser encontradas digitando help mapfile .

Nota:
Eu usei a substituição de processo redirecionada mapfile ... < <( awk ... ) aqui em vez de um canal awk ... | mapfile ... , porque você não pode usar mapfile como parte de um pipeline. Isso ocorre porque os pipelines são executados em subshells, que não propagam suas variáveis alteradas de volta para o shell pai, ou seja, o valor de myarray seria perdido.

    
por Byte Commander 07.01.2018 / 19:31