首页 > 解决方案 > Shell:如何根据每行的第一个单词提取第一个出现的位置?

问题描述

我有一个记录特定操作的日志文件,其中“第一个单词”是操作的 ID,我想从中提取每个 ID 的第一次出现,以便显示每个 ID 的第一个操作。

我不确定我是否很清楚,所以假设我有一个文件监控一群人的行为,并且每次有人做某事时都会更新:

爱丽丝吃了一个苹果
伊芙睡着了
鲍勃看电视
鲍勃坐在椅子上
爱丽丝去厨房
戴夫喝咖啡
卡罗尔买了一辆车
伊芙喂了猫
伊芙倒垃圾
戴夫洗了个澡
鲍勃洗了碗
爱丽丝读了
卡罗尔玩的一本书钢琴
...

假设我想看看每个人做的第一个动作是什么,所以想要的输出是:

爱丽丝吃了一个苹果
夏娃睡着了
鲍勃看了电视
戴夫喝了咖啡
卡罗尔买了一辆车

我尝试了 uniq 和 grep 的一些组合,但有一个问题:要使用 uniq 命令,我需要先对行进行排序,这违背了我获得第一次出现的目的(例如,“Eve fed the cat”将出现在“之前”夏娃睡着了”)

有没有更好的方法来实现这一目标?

感谢大家花时间阅读我。

标签: linuxbashshell

解决方案


使用 awk 这很简单:

$ awk '++arr[$1]==1' file

印刷:

Alice ate an apple 
Eve fell asleep 
Bob watched TV 
Dave drank coffee 
Carol bought a car 

以这种方式工作:

awk '++arr[$1]==1' file
        ^           arr is an associative array with key/value combo
      ^             when created with $1 key (the first col) val is 0
      ^             ++before adds 1 before return value         
               ^    equal to
                 ^  1 meaning first time seen
    ^           ^   if this resolve true (col 1 seen first time) print

您可以使用其他 shell 工具(Bash、Ruby、Perl、Python 等)执行此操作,但几乎所有简单的解决方案都将使用该工具版本的关联数组来计算 X 出现的次数。


推荐阅读