检索记录的第一次出现,其中匹配模式是从输入中获取的

检索记录的第一次出现,其中匹配模式是从输入中获取的

我有一个这样的列表:

2017-12-11  AAOI    40.33
2017-11-15  AAOI    44.3492
2017-12-15  AEIS    70.98
2017-11-15  AEIS    80.137
2017-10-23  AIEQ    25.1601
2017-11-15  AMBA    52.6501
2017-12-05  ATHM    57.2
2017-11-09  AUDC    7.02
2017-12-22  BEW 0.58
2017-10-17  BIOP    8.19
2017-12-08  BLDP    4.86
2017-12-21  BLOC    2.3
2017-12-12  BLOC    2.7
2017-12-11  BLOC    2.32
2017-12-04  BLOC    2.39
2017-11-27  BLOC    2.6
2017-11-15  BOX     21.63
2017-12-22  BTL 10.5638
etc.

我想获得每个符号的第一个(最近的)匹配,符号保存在第二列中。根据上面的示例输入,输出应该是:

2017-12-11  AAOI    40.33
2017-12-15  AEIS    70.98
2017-10-23  AIEQ    25.1601
2017-11-15  AMBA    52.6501
2017-12-05  ATHM    57.2
2017-11-09  AUDC    7.02
2017-12-22  BEW 0.58
2017-10-17  BIOP    8.19
2017-12-08  BLDP    4.86
2017-12-21  BLOC    2.3
2017-11-15  BOX 21.63
2017-12-22  BTL 10.5638

该列表已按第 2 列升序排序,然后按第 1 列降序排序。

我正在考虑使用 awk 将匹配模式设置为 $2 (第二列),并将基于此模式的匹配管道传输到 head 中。

这并不是第一次发生;这是第一个唯一的出现,其中唯一性仅基于第 2 列。类似于按列的 uniq 并仅返回第一次出现的情况。因此慷慨地使用标签。

我无法将这些点联系起来。你会怎么做?

答案1

有两种方法可以做到这一点:

sort -u -k2,2 infile
awk -F" " '!_[$2]++' infile

答案2

我通过 awk 和 sed 组合完成了此操作。


for  w in `cat filename | awk '{print $2}' | sort | uniq`; do sed -n '/'$w'/p' filename| sed -n '1p'; done 

输出


2017-12-11  AAOI    40.33
2017-12-15  AEIS    70.98
2017-10-23  AIEQ    25.1601
2017-11-15  AMBA    52.6501
2017-12-05  ATHM    57.2
2017-11-09  AUDC    7.02
2017-12-22  BEW 0.58
2017-10-17  BIOP    8.19
2017-12-08  BLDP    4.86
2017-12-21  BLOC    2.3
2017-11-15  BOX     21.63
2017-12-22  BTL 10.5638

相关内容