Usando o ARGV para obter entrada do usuário no script Awk [closed]

0

Eu sei que ARGV[i] pode ser usado para armazenar entradas do usuário. No entanto, quero usá-lo no script awk e obter o ARGV[i] para comparar o campo de outro arquivo de texto. Se o ARGV[i] corresponder ao campo ou o campo contiver ARGV[i] , que é a entrada do usuário, quero retornar os outros campos dessa linha.

Digamos que eu tenha um arquivo, testing.txt :

123123123:Walter White:1:2:3:4
123123124:Jesse Pinkman:1:3:4:1

Este é o meu script awk, awkScript.awk :

 #!/usr/bin/awk -f
    BEGIN{FS = ":"; print "ENTER A NAME: "}
    {
        for (i = 1; i < ARGC; i++)
        {   
            if ($2 ~ /'ARGV[i]'/)
            {
                print "Member ID: " $1
            }
        }
    }

Apenas imprime ENTER A NAME: quando executo o arquivo de script. Ele nem recebe a entrada do usuário.

    
por coding 19.10.2014 / 11:03

1 resposta

3

Para corresponder ao conteúdo de ARGV[i] , você precisa alterar seu teste para

if ($2 ~ ARGV[i])

Caso contrário, você está testando uma correspondência para o literal regex 'ARGV[i]' , que não é o que você deseja.

Então o seu script funcionará (tipo) se você executá-lo assim:

awk -f qtest.awk testing.txt "Jesse Pinkman" "Walter White"

Mas, em seguida, ele lançará um erro quando terminar de ler o testing.txt e tentar abrir o arquivo "Jesse Pinkman" (a menos, é claro, que você tenha um arquivo com esse nome).

Em outras palavras, o ARGV contém os nomes de arquivos passados para o seu script pelo shell e você não deve tentar usá-lo para passar argumentos arbitrários. A maneira usual de passar argumentos sem arquivo para um script awk é usar a sintaxe -v var = val para inicializar variáveis em seu script.

Mas suspeito que uma abordagem melhor aqui é ler testing.txt em seu bloco BEGIN, usando a sintaxe getline var <namefile.txt , dividindo os dados (usando a função split() ) e armazenando os dados divididos em uma matriz 2D . Em seguida, o loop de processamento principal pode ler nomes (de um arquivo ou do usuário) e você pode testar esses nomes usando os dados salvos no array.

    
por 19.10.2014 / 11:59