根据列重新排列文件中的行

时间:2016-06-06 20:55:44

标签: bash shell sorting awk grep

我希望根据最后一列有一些数字来重新排列这个文本文件(test.txt)中的行。例如,在下面的文件中,我们分别看到最后一列的数字714,708,816,202,222。现在我想要根据最后一列

按升序重新排列整列
wwwdev.comp.Hello:443          Hello, Inc.     Valid    May 20 2018 714 
Hostname                          cert          expiry
hidev.comp.Hello:443           Hello, Inc.     Valid    May 14 2018 708 
 hidev.comp.Hello:443           Hello, Inc.     Valid   --------------                          
gtdev.Hello:443                Hello, Inc.     Valid    Aug 30 2018 816                                                                                       
wwwdev.Hello:443               Hello, Inc.     Valid    Dec 24 2016 202                                
wwwdev.Hello:443               Hello, Inc.     Valid    Dec 24 2016 222 

预期的O / P:

   wwwdev.Hello:443               Hello, Inc.     Valid    Dec 24 2016 202 
   Hostname                          cert          expiry
    wwwdev.Hello:443               Hello, Inc.     Valid    Dec 24 2016 222 
    hidev.comp.Hello:443           Hello, Inc.     Valid   --------------  
    hidev.comp.Hello:443           Hello, Inc.     Valid    May 14 2018 708
    wwwdev.comp.Hello:443          Hello, Inc.     Valid    May 20 2018 714
    gtdev.Hello:443                Hello, Inc.     Valid    Aug 30 2018 816 

尝试:

 sort -k6 -n test.txt

请建议。

注意:我必须跳过没有数字的行并继续下一行。

2 个答案:

答案 0 :(得分:4)

$ sort -n -k8 file

wwwdev.Hello:443               Hello, Inc.     Valid    Dec 24 2016 202
wwwdev.Hello:443               Hello, Inc.     Valid    Dec 24 2016 222
hidev.comp.Hello:443           Hello, Inc.     Valid    May 14 2018 708
wwwdev.comp.Hello:443          Hello, Inc.     Valid    May 20 2018 714
gtdev.Hello:443                Hello, Inc.     Valid    Aug 30 2018 816  

如果您不知道有多少列,请使用awk更好地装饰/排序/取消装饰。

$ awk '{print $NF "\t" $0}' file | sort -n -k1,1 | cut -f2-

答案 1 :(得分:0)

使用GNU awk 4. * for sorted_in:

$ cat tst.awk
/[0-9]+\s*$/ { sorted[$NF]=$0; next }
{ fixed[NR]=$0 }
END {
    PROCINFO["sorted_in"] = "@ind_num_asc"
    for (key in sorted) {
        if (++onr in fixed) {
            print fixed[onr++]
        }
        print sorted[key]
    }
}

$ awk -f tst.awk file
wwwdev.Hello:443               Hello, Inc.     Valid    Dec 24 2016 202
Hostname                          cert          expiry
wwwdev.Hello:443               Hello, Inc.     Valid    Dec 24 2016 222
 hidev.comp.Hello:443           Hello, Inc.     Valid   --------------
hidev.comp.Hello:443           Hello, Inc.     Valid    May 14 2018 708
wwwdev.comp.Hello:443          Hello, Inc.     Valid    May 20 2018 714
gtdev.Hello:443                Hello, Inc.     Valid    Aug 30 2018 816