プレーンテキストファイルがありますinput.txt
これは次のようになります:
D000001 D000001 44 1975
D000001 D000408 1 1983
D000001 D000641 1 1977
D000001 D000900 27 1975
この単純なAWK行を使用してこのファイルを処理します。
awk '{if ($4 == 1975) print $1,$2,$3}' input.txt
次に、最初のコマンドライン引数としてファイルを受け入れるPythonスクリプトがあります:
#!/usr/bin/env python3
import sys
file_name = sys.argv[1]
print(file_name)
AWK出力をファイル引数としてPythonプログラムにパイプすることは可能ですか?それを行う方法は?
pipeを使用する場合は、pythonスクリプトはstdinから読み取る必要があります。スクリプトはそれを行いません。代わりに、ファイル名が必要です。コマンドライン。これは、プロセス置換と呼ばれるシェル機能を使用して2つを接続することで実現できます。
_script.py <(awk '{if ($4 == 1975) print $1,$2,$3}' input.txt)
_
<(...)
はプロセス置換を示します。ここで何が起こるかというと、シェルはawkコマンドの出力を含むファイルのようなオブジェクトを作成します。このファイルのようなオブジェクトにも名前があります。スクリプトを実行すると、出力にはその名前が表示され、python as _sys.argv[1]
_として渡されます。次のようになります。
_/dev/fd/63
_
これは古い質問ですが、bashを使用していて、スクリプトに次のようなものがある場合
import sys
x = sys.argv[1]
print x
スクリプトに入れずにコマンド出力をパイプしたい場合は、
test.py $(some_command -w arguments)
出力から単一の文字列を期待している場合は、argv [1]として返されます。複数の文字列が必要な場合は、個別に渡されてargv []配列に配置されます。内容を確認したい場合は、次のようにします。
print argv[1:] #starting at index 1 so you don't get the script name in the output
配列として返される出力の種類である場合は、pythonスクリプトを変更して、すべての出力を1つの呼び出し可能なオブジェクトに入れる必要があります。受け入れられた答えですが、スクリプト内で直接コマンドを呼び出して、出力を変数に保存することもできます。
import subprocess
x = subprocess.check_output("awk '{if ($4 == 1975) print $1,$2,$3}' ./test.txt",Shell=True)
print x
どの出力
D000001 D000001 44
D000001 D000900 27
* printステートメントは任意であり、値を表示するために選択されただけです