linux - 如何根据以下要求对列进行排序

标签 linux vim awk sed

我有 3 列

a 03 w
a 10 x
a 01 y
b 20 w
b 01 x
c 02 w
c 10 y
c 12 z

预期输出是

a 10 x
b 20 w
c 12 z

即我需要对第 2 列进行排序但不更改第 1 列的顺序 然后根据第 2 列 grep 列表中具有最大值的行

最佳答案

两种方法(选择你喜欢的一种):

1) sort + uniq “技巧”:

sort -k1,1 -k2,2rn file | uniq -w1
  • -k1,1 - 在第一阶段按第一个字段对行进行排序

  • -k2,2rn - 按倒数顺序按第二个字段对行进行排序

  • uniq -w1 - 输出比较不超过 1 的唯一行行中的字符(可以调整 -w<number> )

输出:

a 10 x
b 20 w
c 12 z

2) 使用 GNU datamash 工具即可:

datamash -Wsf -g1 max 2 <file | cut -f1-3

输出:

a   10  x
b   20  w
c   12  z

关于linux - 如何根据以下要求对列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46109184/

相关文章:

ruby - 在 win7 上的 ruby​​ 文件中运行自动完成时 gVim 崩溃

linux - awk命令解析grep

c++ - 将 R/O 分区挂载为 R/W 进行写入,然后在 C 中设置回 R/O

vim - 为什么这个 .vimrc 映射在终端中不起作用(但它在 MacVim 中起作用): map <S-Enter> O<Esc>

c - Vim 支持;将 c 编译器更改为 clang

regex - 用 RegEx 和 awk 或 sed 将一些点 (.) 替换为逗号 (,)

linux - 使用 sed 搜索所有文件的前 3 次和后 3 次出现

linux 2.6.43,ext3,10K RPM SAS 磁盘,在不同文件上进行 2 个顺序写入(直接 io),就像随机写入一样

c++ - 另一个时区的日期 : C++ on Linux

linux - 从 Gnome 迁移到 XFCE