Twitterを見ていたら、そういう処理について見かけたので備忘で残しておく。 あるディレクトリ配下のファイルに対して、特定の列(3列目など)をpasteで横並びにして比較するというもの。

ファイル数が決まってて、かつ少ないのであれば、pasteに対してプロセス置換を使ってコマンドの実行結果を渡すことで対応ができるけど、ファイル数が多いとちょっとツライ。

paste <(cut -f1 hoge.txt) <(cut -f1 fuga.txt)

とはいえ基本形はこれで対応できるので、うまいことプロセス置換をする箇所について自動生成させてやればいい。 例えば、以下のような形でglobでのワイルドカードからブレース展開でのプロセス置換を生成して、それをevalで実行させてやればいい。

eval eval paste "'<(cut -d\" \" -f2 '{"$(echo /tmp/*.txt|tr \  ,)"}')'"

[root@BS-PUB-CENT7-01 ~]# grep . /tmp/test*
/tmp/test1.txt:a01 a02 a03 a04 a05
/tmp/test1.txt:b01 b02 b03 b04 b05
/tmp/test1.txt:c01 c02 c03 c04 c05
/tmp/test2.txt:e01 e02 e03 e04 e05
/tmp/test2.txt:f01 f02 f03 f04 f05
/tmp/test2.txt:g01 g02 g03 g04 g05
/tmp/test3.txt:i01 i02 i03 i04 i05
/tmp/test3.txt:j01 j02 j03 j04 j05
/tmp/test3.txt:k01 k02 k03 k04 k05
[root@BS-PUB-CENT7-01 ~]# eval eval paste "'<(cut -d\" \" -f2 '{"$(echo /tmp/*.txt|tr \  ,)"}')'"
a02 e02 i02
b02 f02 j02
c02 g02 k02

列数がものすごく多いとツライけど、ひとまずはこんな感じで対処できる。 evalでやる以外には、globのワイルドカード指定からpasteで実行するプロセス置換のコマンドを生成して、それをパイプでbashに渡すといった方法も考えられる。