Question Comment diriger la sortie de commande AWK vers Python en tant que premier argument


J'ai un fichier texte en clair input.txt qui ressemble à:

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

Je traite ce fichier en utilisant une simple ligne AWK:

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

J'ai un script Python qui accepte le fichier comme premier argument de ligne de commande:

#!/usr/bin/env python3

import sys

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

Je me demande s'il est possible de diriger la sortie AWK vers le programme Python en tant qu'argument de fichier et comment faire cela?


3
2018-04-27 05:25


origine




Réponses:


Si vous voulez utiliser un tuyau, alors votre script python devrait lire stdin. Votre script ne le fait pas. Au lieu de cela, il attend un nom de fichier sur la ligne de commande. Cela peut être accompli en utilisant une fonction de shell appelée substitution de processus relier les deux ensemble:

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

<(...) dénote une substitution de processus. Ce qui se passe ici est que le shell crée un objet de type fichier qui contient la sortie de la commande awk. Cet objet de type fichier a même un nom. Si vous exécutez le script, la sortie verra son nom, transmis à python as sys.argv[1], est quelque chose comme:

/dev/fd/63

2
2018-04-27 05:46





Ceci est une vieille question, mais si vous êtes sur bash et votre script a quelque chose comme

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

et vous vouliez canaliser la sortie de commande sans la mettre dans le script, vous pourriez le faire avec

test.py $(some_command -w arguments)

Si vous attendez une seule chaîne de votre sortie, elle sera renvoyée sous la forme argv [1]. Si vous attendez plusieurs chaînes, elles seront transmises individuellement et placées dans le tableau argv [], et si vous voulez vérifier le contenu que vous faites

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

S'il s'agit du type de sortie renvoyé en tant que tableau, vous devez modifier votre script python pour que toute la sortie soit placée dans un objet appelable. Il y a le chemin dans la réponse acceptée, mais vous pouvez aussi simplement appeler la commande directement dans votre script et enregistrer la sortie dans une variable avec

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

quelles sorties

D000001 D000001 44
D000001 D000900 27

* les instructions d'impression sont arbitraires et viennent juste d'être choisies pour afficher les valeurs


0
2018-04-22 04:31