0

past postingには、のコマンドについてBashで、行ごとにテキスト列を並べ替えるように尋ねました。所望のタスク(すなわち、行ごとに異なるサイズと内容のテキスト列を整列する)は、最初に予想されたよりもはるかに複雑であり、提案されたanswerは、過去の投稿に対して許容されるが、ほとんどの経験的データセット。したがって、私は次の擬似コードでコミュニティに問い合わせたいと思います。具体的には、私は次の擬似コードがどのように最適化できるかどうかを知りたいと思います。サイズと内容が異なるテキスト列の整列

n文字列のファイルを仮定します。一部の文字列が欠落している可能性があります。最長の列は、ファイルにリストされた最初の列ではなく、参照列でなければなりません。この参照列の行の順序を維持する必要があります。

> cat file # where n=3; first row contains column headers 
CL1 CL2 CL3 
foo foo bar 
bar baz qux 
baz qux 
qux foo 
    bar 

擬似コードの試み1(全く不十分):サイズによって

Shuffle columns so that columns ordered by size (i.e., longest column is first in matrix) 
Rownames = strings of first column (i.e., of longest column) 
For rownames 
    For (colname among columns 2:end) 
    if (string in current cell == rowname) {keep string in location} 
    if (string in current cell != rowname) { 
     if (string in current cell == rowname of next row) {add row to bottom of table; move each string of current column one row down} 
     if (string in current cell != rowname of next row) {add row to bottom of table; move each string of all other columns one row down} 
    } 

注文コラム:

> cat file_columns_ordered_by_size 
CL2 CL1 CL3 
foo foo bar 
baz bar qux 
qux baz 
foo qux 
bar 

で探した出力:

> my_code_here file_columns_ordered_by_size 
CL2 CL1 CL3 
foo foo 
    bar bar 
baz baz  
qux qux qux 
foo 
bar 

答えて

0

編集:うわ、このdoesnあなたが望む出力を生み出すことはできません。私は問題を理解していないと思う。とにかく助けてくれるかもしれません。

テーブル全体をメモリにスラピングしても構わない場合は、連想配列(ハッシュ)が機能します。 (または、ツリー、マップ、辞書などを使用できます)各列に1つの文字列(その列のセルにある文字列)を、その列に文字列が見つかる回数にマッピングします。列ヘッダーの後にハッシュの名前を付けましょう。そして、各繰り返しで連想配列から削除、出力を生成ループを記述

CL2 = {'foo':2, 'baz':1, 'bar':1, 'qux':1} 
CL1 = {'foo':1, 'baz':1, 'bar':1, 'qux':1} 
CL3 = {'bar':1, 'qux':1} 

# Store the columns in an array 
columnCounts = [CL2, CL1, CL3] 

while (columnCounts still has at least one non-empty hash) { 
    key = the hash-key that is present in most (a plurality) of the hashes 
    for each hash in columnCounts { 
     if the key is in the hash { 
      print key 
      Decrement hash[key] 
     } 
     else { 
      print whitespace 
     } 
    } 

    print newline 
} 
ズルズルした後、彼らはこのようになります
関連する問題