2017-08-19 5 views
0

私は大きな行列を1.5M行から150,000列まで持っています。私は、与えられた行と列の名前に基づいてこの大きな行列を部分集合にしたい。ここで私は選択のカラムC1とC3とSCOLと呼ばれるこれらの選択した列を含むファイル名を欲しい行と列の名前に基づいたbashサブセッティング

  c1 c2 c3 c4 
row1  11 12 13 14 

row2  21 22 23 24 

row3  31 32 33 34 

row4  41 42 43 44 

row5  51 52 53 54 

大きな行列の一例です。出力をsRowパラメーターと呼ばれる、選択した行が含まれており、ROW2 ROW4 ROW5

を含むファイル名が

 c1 c3 

row2 21 23 

row4 41 43 

row5 51 53 

すべてのヘルプを次のようにのように見えますか?

+0

これは役立つかもしれない:[名によって特定の列を印刷する方法は?]( https://unix.stackexchange.com/q/25138/74329) – Cyrus

答えて

0

あなたのフィールドセパレータがスペースであるとすると、とします。

function find_row { grep -P $2 $1; } 

function find_column { head -n1 $1 | sed 's/ \+/\n/g' | grep -n $2 | grep -oP '^[0-9]+'; } 

function get_column_string { while read line; do find_column $1 $line; done<$2 | sed 's/^/printf " " $/g;s/$/;/g' | tr -d '\n' | sed 's/$/print ""/g; s/^/printf $1;/g'; } 

function get_row_string { sed 's/^/^/g;s/$/|/g;' $1 | tr -d '\n' | sed 's/|$//g'; } 

function get_subset { grep -P "$(get_row_string $2)" $1 | awk '{'"$(get_column_string $1 $3)"'}'; } 

これらの機能を追加した後。

あなたがこれを実行できます。

get_subset mainfile.txt srow scol 

この意志出力:

mainfile.txt:

行を

rows c1 c3 
row2 21 23 
row4 41 43 
row5 51 53 

を次のように内容があると仮定c1 c2 c3 c4

ROW1 11 12 13 14

ROW2 21 22 23 24

ROW3 31 32 33 34

ROW4 41 42 43 44

ROW5 51 52 53 54

Scol:

C1
C3

sRowパラメーター:


ROW2
ROW4
ROW5

関連する問題