各パイプラインプログラムの出力をバックアップする方法は?

各パイプラインプログラムの出力をバックアップする方法は?

私はデータ分析に毎日パイプラインプログラムを使用しています。
alias analyze='fetch_data | prog1 | prog2 | prog3 > result.txt'
このスクリプトはほとんどの場合うまく機能しますが、約1%の場合は失敗します。繰り返し実行するのは時間がかかりますので、各プロセスの結果をバックアップできることを願っています。たとえば、次のようになります。

/tmp/2017-10-31-10am/fetch_data.txt
/tmp/2017-10-31-10am/prog1.txt
/tmp/2017-10-31-10am/prog2.txt
/tmp/2017-10-31-10am/prog3.txt

答え1

エイリアスに今日の日付/tmp/YYYY-MM-DD-HH(amまたはpmの後の形式)に基づいて/ tmpにディレクトリを作成させるには、すべての中間出力を別々のファイルに保存します。

alias analyze='d=$(date +"/tmp/%Y-%m-%H%p"); mkdir "$d" && fetch_data | tee "$d/fetch_data.txt" | prog1 | tee "$d/prog1.txt" | prog2 | tee "$d/prog2.txt" | prog3 > "$d/result.txt"'

または複数行に分割します。

alias analyze='
  d=$(date +"/tmp/%Y-%m-%H%p")
  mkdir "$d" && 
  fetch_data | tee "$d/fetch_data.txt" | 
  prog1 | tee "$d/prog1.txt" | 
  prog2 | tee "$d/prog2.txt" | 
  prog3 > "$d/result.txt"
  '

これはdateディレクトリ名/テンプレートの作成に依存します。tee着信データをファイルにコピーし、パイプに沿って渡すユーティリティです。

例を実行してください(fetch_dataなどを作成したプログラムに置き換えます):

alias a='
  d=$(date +"/tmp/%Y-%m-%H%p")
  mkdir "$d" && 
  seq 10 | tee "$d/seq.out" | 
  head -6 | tee "$d/head.out" | 
  sed s/3/j/ | tee "$d/sed.out" | 
  tail -4 > "$d/result.txt"
  '

結果:

$ ls /tmp/2017-10-19PM/
head.out  result.txt  sed.out  seq.out

$ cat /tmp/2017-10-19PM/seq.out
1
2
3
4
5
6
7
8
9
10

$ cat /tmp/2017-10-19PM/head.out
1
2
3
4
5
6

$ cat /tmp/2017-10-19PM/sed.out
1
2
j
4
5
6

$ cat /tmp/2017-10-19PM/result.txt
j
4
5
6

答え2

何を求めているのか分からない。各プログラムの出力を保存するには:

fetch_data | tee f_d.txt | prog1 | tee prog1.txt | prog2 | tee prog2.txt | prog3 > result.txt

(読みやすくするために短縮されたものですfetch_data.txt。)と同じではありf_d.txtませんか?prog3.txtresult.txt

関連情報