Como canalizar a saída do comando AWK para o Python como primeiro argumento

3

Eu tenho um arquivo de texto simples input.txt que se parece com isso:

D000001 D000001 44 1975
D000001 D000408 1 1983
D000001 D000641 1 1977
D000001 D000900 27 1975

Eu processo esse arquivo usando essa linha simples do AWK:

awk '{if ($4 == 1975) print $1,$2,$3}' input.txt

Então eu tenho um script Python que aceita um arquivo como o primeiro argumento de linha de comando:

#!/usr/bin/env python3

import sys

file_name = sys.argv[1]
print(file_name)

Eu me pergunto se é possível canalizar a saída AWK para o programa Python como argumento de arquivo e como fazer isso?

    
por Andrej 27.04.2016 / 07:25

2 respostas

3

Se você quiser usar um pipe , seu script python teria que ler stdin. Seu roteiro não faz isso. Em vez disso, espera um nome de arquivo na linha de comando. Isso pode ser feito usando um recurso de shell chamado substituição de processo para conectar os dois:

script.py <(awk '{if ($4 == 1975) print $1,$2,$3}' input.txt)

<(...) denota a substituição do processo. O que acontece aqui é que o shell cria um objeto semelhante a um arquivo que contém a saída do comando awk. Esse objeto semelhante a arquivo tem até um nome. Se você executar o script, a saída verá seu nome, passado para python como sys.argv[1] , é algo como:

/dev/fd/63
    
por 27.04.2016 / 07:46
0

Esta é uma pergunta antiga, mas se você está no bash e seu script tem algo como

import sys
x = sys.argv[1]
print x

e você queria canalizar a saída do comando sem colocá-lo no script, você poderia fazer isso com

test.py $(some_command -w arguments)

Se você está esperando uma única string de sua saída, ela será retornada como argv [1]. Se você estiver esperando várias strings, elas serão passadas individualmente e colocadas na matriz argv [], e se você quiser verificar o conteúdo que você faria

print argv[1:] #starting at index 1 so you don't get the script name in the output

Se for o tipo de saída que seria retornado como uma matriz, você teria que modificar seu script python para obter toda a saída colocada em um objeto que pode ser chamado. Existe o caminho na resposta aceita, mas você também pode simplesmente chamar o comando diretamente dentro do seu script e salvar a saída em uma variável com

import subprocess
x = subprocess.check_output("awk '{if ($4 == 1975) print $1,$2,$3}' ./test.txt",shell=True)
print x

quais saídas

D000001 D000001 44
D000001 D000900 27

* instruções de impressão são arbitrárias e apenas escolhidas para mostrar os valores

    
por 22.04.2018 / 06:31