2019年3月27日 星期三

用Process substitution做多重輸入

使用指令的時候,一般都只會有一個標準輸入,使用方式則是用符號小於<。若是此程式需要不只一個輸入,且不想要另外產生暫存檔案,這時候就可以使用process substitution來達成。例如說找30以下2和3的倍數,只要用下面的指令即可:
  • comm -12 <(seq 2 2 30 | sort) <(seq 3 3 30 | sort) | sort -n

使用上要注意<和( )之間不能夠有空格,指令的輸出其實就是下面三個指令的結果,但不只比較簡潔,而且中間並不需要暫存檔,也就不需要煩惱暫存檔要取什麼名字:
  1. seq 2 2 30 | sort > two.sort
  2. seq 3 3 30 | sort > three.sort
  3. comm -12 two.sort three.sort | sort -n
上面檔案two.sortthree.sort分別代表的是2的倍數和3的倍數,再用comm指令來找出共有的部分。用傳統的方法必須要同時製作兩個暫存檔,而且必須要等這兩個指令都完成後才能夠執行第3個指令。若是使用process substitution的話,就能夠專注在跑程式上面而不需要去處理中間暫存檔的問題。相似的手法也可以做成多重輸出,只是把 < 改成 >


參考資料

_EOF_

沒有留言:

張貼留言