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

Edit: Тьфу, это Безразлично Не создавайте желаемый результат. Наверное, я не понимаю эту проблему. Может быть, это поможет.

Если вы не возражаете, чтобы повредить всю таблицу в памяти, будут работать ассоциативные массивы (хэши). (Или вы можете использовать деревья, карты, словари и т. Д.). Для каждого столбца будет отображаться строка, отображающая строки (найденные в ячейках этого столбца), до количества раз, когда эта строка найдена в этом столбце. Назовем хеши после заголовков столбцов. После прихлебывая, они будут выглядеть примерно так:

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 
}