博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
awk根据指定字符串内容排序
阅读量:363 次
发布时间:2019-03-04

本文共 1800 字,大约阅读时间需要 6 分钟。

引言

最近需要对一个MarkDown表格进行排序,关键字段是在第一个的两个|中间,如下

|8| | |Medium|
|5| | |Medium|
|17| | |Medium|
|538| | |Medium|
|1122| | |Easy|
|40| | |Medium|
|3| | |Medium|
|1| | |Easy|
|925| | |Easy|
|7| | |Easy|
|113| | |Medium|
|2| | |Medium|
|9| | |Easy|
|6| | |Medium|
|1370| | |Easy|
|78| | |Medium|
|208| | |Medium|
|1024| | |Medium|
|529| | |Medium|
|39| | |Medium|
|15| | |Medium|
|1291| | |Medium|
|11| | |Medium|
|865| | |Medium|
|16| | |Medium|
|89| | |Medium|
|12| | |Medium|
|14| | |Easy|
|402| | |Medium|
|856| | |Medium|
|19| | |Medium|
|290| | , |Easy|
|389| | |Easy|

解决方法

想到用shell脚本通过awk来进行排序,代码如下:

for i in `awk '{split($1,a,"[\|\|]");print NR,a[2]}' test.txt | sort -n -k2 | awk '{print $1}'`; do awk 'NR=='$i'{print}' test.txt; done

思路就是:

  • 先通过split($1,a,"[\|\|]"分割出test.txt第一列中的关键字段
  • 然后通过print NR,a[2]记录每一列的列号和关键字段
  • 然后对关键字段进行排序sort -nr -k2
  • 其次在外层使用for i infor循环将每一个列号输入到 'NR=='$i'
  • 最后根据'NR=='$i'排序好的列号打印出test.txt每一行数据

结果如下:

|1| | |Easy|
|2| | |Medium|
|3| | |Medium|
|5| | |Medium|
|6| | |Medium|
|7| | |Easy|
|8| | |Medium|
|9| | |Easy|
|11| | |Medium|
|12| | |Medium|
|14| | |Easy|
|15| | |Medium|
|16| | |Medium|
|17| | |Medium|
|19| | |Medium|
|39| | |Medium|
|40| | |Medium|
|78| | |Medium|
|89| | |Medium|
|113| | |Medium|
|208| | |Medium|
|290| | , |Easy|
|389| | |Easy|
|402| | |Medium|
|529| | |Medium|
|538| | |Medium|
|856| | |Medium|
|865| | |Medium|
|925| | |Easy|
|1024| | |Medium|
|1122| | |Easy|
|1291| | |Medium|
|1370| | |Easy|

效果如下:

# Title Solution Difficulty
1 Easy
2 Medium
3 Medium
5 Medium
6 Medium
7 Easy
8 Medium
9 Easy
11 Medium
12 Medium
14 Easy
15 Medium
16 Medium
17 Medium
19 Medium
39 Medium
40 Medium
78 Medium
89 Medium
113 Medium
208 Medium
290 , Easy
389 Easy
402 Medium
529 Medium
538 Medium
856 Medium
865 Medium
925 Easy
1024 Medium
1122 Easy
1291 Medium
1370 Easy

转载地址:http://axrr.baihongyu.com/

你可能感兴趣的文章