In un post precedente , ho chiesto dei comandi in < em> Bash per allineare colonne di testo l'una contro l'altra per riga. Mi è diventato chiaro che il compito desiderato (cioè allineare colonne di testo di diverse dimensioni e contenuto per riga) è molto più complesso di quanto inizialmente previsto e che il answer , mentre accettabile per il post precedente, non è sufficiente nella maggior parte dei set di dati empirici. Quindi, vorrei interrogare la comunità sul seguente pseudocodice. In particolare, vorrei sapere se e in che modo il seguente pseudocodice potrebbe essere ottimizzato.
Assumi un file con le colonne n di stringhe. Alcune stringhe potrebbero mancare, altre potrebbero essere duplicate. La colonna più lunga potrebbe non essere la prima elencata nel file, ma deve essere la colonna di riferimento. L'ordine delle righe di questa colonna di riferimento deve essere mantenuto.
> cat file # where n=3; first row contains column headers
CL1 CL2 CL3
foo foo bar
bar baz qux
baz qux
qux foo
bar
Tentativo pseudocodice 1 (totalmente inadeguato):
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}
}
Ordina le colonne per dimensione:
> cat file_columns_ordered_by_size
CL2 CL1 CL3
foo foo bar
baz bar qux
qux baz
foo qux
bar
Output ricercato:
> my_code_here file_columns_ordered_by_size
CL2 CL1 CL3
foo foo
bar bar
baz baz
qux qux qux
foo
bar