2013-09-26 39 views
1

我有一個存儲有向圖的文件。每一行表示爲兩列tsv文件的聯合

節點1 TAB節點2 TAB重量

我想找到一組節點。有沒有更好的工會方式?我目前的解決方案包括創建臨時文件:

cut -f1 input_graph | sort | uniq > nodes1 
cut -f2 input_graph | sort | uniq > nodes2 
cat nodes1 nodes2 | sort | uniq > nodes 

回答

2
{ cut -f1 input_graph; cut -f2 input_graph; } | sort | uniq 

無需兩次排序。

{cmd1; CMD2; }語法等同於(cmd1; cmd2),但可能會避免子外殼。

在另一種語言(例如Perl)中,您可以嘲笑散列中的第一列,然後順序處理第二列。

僅使用Bash,您可以使用語法cat <(cmd1) <(cmd2)來避免臨時文件。 Bash負責創建臨時文件描述符並設置管道。

在腳本(你可能希望避免需要bash)的,如果你最終需要臨時文件,使用mktemp

+0

你可以在'mktemp'詳細點嗎? – damned

+0

這是一個邊緣點,爲您未來的腳本習慣提供參考(這就是爲什麼我最後提到它的原因)。例如。在您的ORIGINAL代碼中,您可以使用'mktemp'生成臨時文件名(而不是硬編碼文件名「nodes1」和「nodes2」):'NODES1 = $(mktemp);剪切-f1 input_graph |排序| uniq>「$ NODES1」'。但是,當然沒有任何臨時文件的實際需要,使用硬編碼的名稱或不是:) – dan3