基于行名和列名的bash子集

时间:2017-08-19 02:42:09

标签: bash unix

我有一个1.5M行,150,000列的大矩阵。我希望基于给定的行和列名称的子集这个大矩阵。这是一个大矩阵的例子

           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

我想选择列c1和c3,包含这些选定列的文件名称为scol。包含所选行的文件名称为srow,包含row2 row4 row5

输出如下所示

     c1  c3 

row2 21  23 

row4 41  43 

row5 51  53

任何帮助?

1 个答案:

答案 0 :(得分: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

这将输出:

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

假设内容如下:

mainfile.txt:

  

行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:

  

行   第2行   row4
  第5行