在bash中按列标题从左到右排序列

时间:2017-06-22 22:20:02

标签: bash sorting

我想按列标题(从左到右)对文件进行排序。 我想按字母数字从最小数字到最大数字排序(因此2 <10 <21 <100 ......) 我想忽略排序中的第一列(第一列将保留为第一列)。 我不希望从上到下对列进行排序。

示例输入

FirstColumn Acolumn2 Acolumn10 Acolumn1 Bcolumn2 Bcolumn1
Word        pan      mat       toy      grass   bill
string      tan      pat       boy      mass    phil
characters  can      hat       coy      bass    ted

示例输出

FirstColumn Acolumn1 Acolumn2 Acolumn10 Bcolumn1 Bcolumn2
Word        toy      pan      mat       bill     grass
string      boy      tan      pat       phil     mass
characters  coy      can      hat       ted      bass

1 个答案:

答案 0 :(得分:1)

{
    if ( NR == 1 )
    {
            for (i=2;i<=NF+1;i++)
            {
                    cnt[i]=gensub("column","","g",$i)"*"i
            }
    asort(cnt)
    printf $1"\t"
    }
    for ( i=2;i<=NF;i++ )
    {
            split(cnt[i],cnt1,"*")
            printf $cnt1[2]"\t"
    }
    printf "\n"
}

以上awk代码将在一定程度上起作用。

我们首先关注第一行并忽略第一列(从2开始for循环)我们删除&#34;列&#34;字符串中的文本,然后将数据与其索引位置(用星号分隔)一起添加到数组中

然后使用我们添加到数组中的索引对此数组进行排序和循环以打印出数据。

问题是正确排序数据。标准排序将按以下顺序输出数据:

Acolumn1 Acolumn10 Acolumn2 Bcolumn1 Bcolumn2