コンソール上でワイルドカード指定した各ファイルの特定列をpasteで横並びに結合する
Pocket

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

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

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

とはいえ基本形はこれで対応できるので、うまいことプロセス置換をする箇所について自動生成させてやればいい。
例えば、以下のような形で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に渡すといった方法も考えられる。

 

Pocket

Written by blacknon

インフラエンジニア(…のつもり)。 仕事で使うならクライアントはWindowsよりはUNIXの方が好き。 大体いつも眠い。

Leave a Comment

メールアドレスが公開されることはありません。

*