如何在shell脚本中对2列进行排序?

时间:2018-09-07 22:24:59

标签: bash shell

我有这样的数据:

Jul29  16:52
Jul30  19:06
Jul31  17:04
Aug1  17:22
Aug2  18:53
Aug3  21:44
Aug4  22:56
Aug6  17:01
Aug8  02:19
Aug8  16:49
Aug9  16:37
Aug10  21:09
Aug12  05:24
Aug12  17:09
Aug14  16:39
Aug16  16:41
Aug4  22:56
Aug6  17:01
Aug8  02:19
Aug8  16:49
Aug9  16:37
Aug10  21:09
Aug12  05:24
Aug12  17:09
Aug14  16:39
Aug16  16:41
Aug4  22:56
Aug6  17:01
Aug8  02:19
Aug8  16:49
Aug9  16:37
Aug10  21:09
Aug16  20:24
Aug16  19:09
Aug16  18:39
Aug16  16:41

我想取出重复项,按第一列排序,然后保持该顺序并按第二列排序。如下所示:

Jul01 11:00
Aug01 12:00
Aug02 12:40
Aug03 10:00
Aug03 11:00
Aug03 13:00

我有以下代码:     猫文件名| awk'!a [$ 0] ++' 这只会对第一列进行排序,而第二列会发生随机变化。有什么想法吗?

当我尝试cat ming | sort -k1M -k1d -k2V时,我得到了:

Jul29  16:52
Jul30  19:06
Jul31  17:04
Aug10  21:09
Aug10  21:09
Aug10  21:09
Aug1  17:22
Aug12  05:24
Aug12  05:24
Aug12  17:09
Aug12  17:09
Aug14  16:39
Aug14  16:39
Aug16  16:41
Aug16  16:41
Aug16  16:41
Aug16  18:39
Aug16  19:09
Aug16  20:24
Aug2  18:53
Aug3  21:44
Aug4  22:56
Aug4  22:56
Aug4  22:56
Aug6  17:01
Aug6  17:01
Aug6  17:01
Aug8  02:19
Aug8  02:19
Aug8  02:19
Aug8  16:49
Aug8  16:49
Aug8  16:49
Aug9  16:37
Aug9  16:37
Aug9  16:37

2 个答案:

答案 0 :(得分:4)

sort -u -k1.1,1.3M -k1.4n -k2V filename

-u

删除重复的行

-k1.1,1.3M

在月份模式下将单词1,字符1到单词1,字符3的每一行排序

-k1.4n

用数字值对单词1,字符4到单词1末尾的每一行进行排序

-k2V

在“版本号”模式下对第二个单词进行排序,这对于时间戳来说效果很好

答案 1 :(得分:1)

您可以使用以下内容:

sort -k1M -k1.4n -k2V abcss | uniq 

说明:

k1M:在第一列上进行一个月的排序

k1.4n:进行数字排序以按顺序获取列

k2V:在第二列上进行版本排序以获取正确的时间戳

输出将是:

Jul29  16:52
Jul30  19:06
Jul31  17:04
Aug1  17:22
Aug2  18:53
Aug3  21:44
Aug4  22:56
Aug6  17:01
Aug8  02:19
Aug8  16:49
Aug9  16:37
Aug10  21:09
Aug12  05:24
Aug12  17:09
Aug14  16:39
Aug16  16:41
Aug16  18:39
Aug16  19:09
Aug16  20:24