按bash中的行数对文本列进行排序

Mic*_*udl 6 sorting string bash awk multiple-columns

假设一个包含x个字符串列的文本文件.

$cat file # where x=3
foo  foo  foo
bar  bar  bar
     baz  baz
     qux
Run Code Online (Sandbox Code Playgroud)

bash中是否有一种方法可以按照它们包含的数字文本字符串(即填充的行)对这些列进行排序,同时保持每列中行的内部顺序?

$sought_command file
foo  foo  foo
bar  bar  bar
baz  baz
qux
Run Code Online (Sandbox Code Playgroud)

基本上,具有最多行数的列是第一个,具有第二多行数的列是第二个,等等.

(这个任务很容易实现R,但我想知道通过bash的解决方案.)

编辑1:

以下是一些其他详细信息:每列包含至少一个文本字符串(即一个填充行).文本字符串可以构成任何字母数字组合并且具有任何长度(但显然不包含空格).输出列不得插入空行.列分隔符没有先验限制,只要它在整个表中保持一致即可.

此任务所需的只是按原样移动列,以便按列长度排序.(我知道在bash中实现它听起来比实际更容易.)

Ed *_*ton 4

使用 GNU awk forsorted_in 并假设您的列是制表符分隔的:

$ cat tst.awk
BEGIN{ FS=OFS="\t" }
{
    for (i=1; i<=NF; i++) {
        if ($i ~ /[^[:space:]]/) {
            cell[NR,i] = $i
            cnt[i]++
        }
    }
    next
}
END {
    PROCINFO["sorted_in"] = "@val_num_desc"
    for (row=1; row<=NR; row++) {
        c=0
        for (col in cnt) {
            printf "%s%s", (c++?OFS:""), cell[row,col]
        }
        print ""
    }
}

$ awk -f tst.awk file
foo     foo     foo
bar     bar     bar
baz     baz
qux
Run Code Online (Sandbox Code Playgroud)