【问题标题】:Rearrange rows in a file based on the column根据列重新排列文件中的行
【发布时间】:2016-10-06 14:40:23
【问题描述】:

我希望根据最后一列有一些数字重新排列此文本文件 (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

请提出建议。

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

【问题讨论】:

  • rearrange 是一个非常通用的术语来描述排序。

标签: bash shell sorting awk grep


【解决方案1】:
$ 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-

【讨论】:

  • 谢谢@karakfa 无论如何我可以跳过没有数字的行吗?假设文件是​​否有一些没有数字的行
  • 嗨@anubhava 我已经更新了QS:有什么帮助吗?
  • 您更新后的预期结果对我来说没有意义。为什么要保留没有数字的行但每隔一行更改一次?您想在每个标题中进行分段排序吗?通常我希望,如果这些记录对应于丢失的数据案例,则应该将它们分组在顶部或底部。
【解决方案2】:

使用 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

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多