私は基本的にこれをしたいと思います:
tail -f trades.csv | csvtool readable -
csvtoolを使用して読み取ることができる形式のCSVファイルを読みたいと思っています。
tail -f
end-of-stream信号が決して放出されないため、このコマンドは機能しないため、csvtoolは無期限に待機します。確かに、この一般的な問題に対する解決策はありますか?
ありがとう
ベストアンサー1
「EOF放出」のようなものはありません。 EOFは帯域外信号ではありません。 EOFは、読み取ろうとしたときに読み取るデータが残っていないと報告する場合です。
tail -f
出力のエクスポートを開始する前に入力全体を読み取るプログラムに出力がパイプされている場合、プログラムは入力全体を読み取るまで出力をエクスポートしません。出力が閉じないためtail -f
(出力の放出を停止しないため)、これはテールプロセスが終了した後にのみ発生します。
csvtool readable
すべての入力行を読み取り、各セルの幅を決定し、各列のセルの最大幅を計算し、最後に一貫した幅ですべての行と列をエクスポートします。すべての入力が利用可能になるまでこの計算を実行することはできません。なぜなら、最後の行がおそらく最も広いセルを含む行であるからです。したがって、csvtool readable
すべての入力を読み取る前に出力を放出し始めるように設計することは論理的に不可能です。
たぶん、列の幅が同じすべての行に興味がない可能性があります。たぶん、ほとんどの幅が欲しいかもしれませんが、より広い行が現れると幅が拡大します。これは合理的です。しかし、これはcsvtoolが提供する機能ではありません。
多くの場合、「出力はfoo | bar
すぐには放出されず、徐々に放出されますfoo
」が発生しますfoo
。パイプラインでバッファリングをオフにする。しかし、ここで起こっていることはそうではありません。出力をバッファリングするプログラムの完全な入力を必要としないcsvtoolサブコマンドの場合、これはさまざまな状況で問題になる可能性があります。
CSVのコンマをいくつかの列の並べ替えに変換し、列の幅を手動で指定したい場合は、以下は2行の並べ替えです。
tail -f … | python3 -u -c 'import csv, sys
for row in csv.reader(sys.stdin): print("\t".join(row))' | expand -t 11,13,17
expand
ほとんどの端末とエディタで使用されている8つの列ごとにデフォルトのタブが満たされている場合は、この手順は不要です。
1 nitpickersの場合:最初の行の最初のセルを超えることは役に立ちません。