Existe uma maneira de passar uma variável de uma instrução awk para uma função bash como um argumento? [fechadas]

3

Estou tentando procurar alguns valores específicos de (como 1 ou 4 e 2 ou 3) um arquivo de texto usando uma instrução awk em um script bash. Se este valor for encontrado no arquivo (dentro da instrução awk ), então eu quero chamar uma função de fora da instrução awk e passar o valor encontrado como um argumento.

Minhas perguntas: (1) Isso é possível? Se sim, então como? (2) Se não é possível ou há uma maneira melhor, então como?

Observe que estou pulando as duas primeiras linhas do arquivo de texto ao pesquisar o arquivo. Eu estou usando o GNU AWK. Deixe-me saber se mais explicações são necessárias.

** Peço desculpas antecipadamente pelo cross-post, mas não obtive a resposta que estou procurando.

arquivo.txt

Name  Col1  Col2  Col3  
-----------------------
row1  1     4     7        
row2  2     5     8         
row3  3     6     9 

As funções retrieve reais são muito mais complexas do que neste exemplo simplificado. Por isso, preciso fazer uma chamada para essa função, porque não quero colocar isso na instrução awk .

function retrieve {
    if [[ "$1" == "1" ]]; then
        echo "one beer on the wall"
    elif [[ "$1" == "4" ]]; then
        echo "four beers on the wall"
    fi
}

function retrieve2 {
    if [[ "$1" == "2" ]]; then
        echo "two beers on the wall"
    elif [[ "$1" == "3" ]]; then
        echo "three beers on the wall"
    fi
}

awk -F '\t' '
    FNR < 2 {next}
    FNR == NR {
        for (i=2; i <= NF; i++) 
        {
            if (($i == 1) || ($i == 4))
                printf(%s, "'retrieve "$i" '")    # Here is the problem

            if (($i == 2) || ($i == 2))
                printf(%s, "'retrieve2 "$i" '")    # Here is the problem
        }
    }

' file.txt
    
por Alias 21.07.2014 / 22:44

1 resposta

5

Uma maneira feia de fazer isso (isto é, causar uma chamada de função no shell com base na saída de awk ) poderia ser assim:

awk -F '\t' '
    FNR < 2 {next}
    FNR == NR {
        for (i=2; i <= NF; i++) {
            if (($i == 1) || ($i == 4))
                printf "retrieve %s\n", $i

            if (($i == 2) || ($i == 2))
                printf "retrieve2 %s\n", $i
        }
    }

' file.txt | while read l; do eval $l; done

No entanto, isso pode sair pela culatra em alguns casos.

    
por 21.07.2014 / 23:26