linux - Shell:如何根据每行的第一个单词提取第一个出现的位置?
问题描述
我有一个记录特定操作的日志文件,其中“第一个单词”是操作的 ID,我想从中提取每个 ID 的第一次出现,以便显示每个 ID 的第一个操作。
我不确定我是否很清楚,所以假设我有一个文件监控一群人的行为,并且每次有人做某事时都会更新:
爱丽丝吃了一个苹果
伊芙睡着了
鲍勃看电视
鲍勃坐在椅子上
爱丽丝去厨房
戴夫喝咖啡
卡罗尔买了一辆车
伊芙喂了猫
伊芙倒垃圾
戴夫洗了个澡
鲍勃洗了碗
爱丽丝读了
卡罗尔玩的一本书钢琴
...
假设我想看看每个人做的第一个动作是什么,所以想要的输出是:
爱丽丝吃了一个苹果
夏娃睡着了
鲍勃看了电视
戴夫喝了咖啡
卡罗尔买了一辆车
我尝试了 uniq 和 grep 的一些组合,但有一个问题:要使用 uniq 命令,我需要先对行进行排序,这违背了我获得第一次出现的目的(例如,“Eve fed the cat”将出现在“之前”夏娃睡着了”)
有没有更好的方法来实现这一目标?
感谢大家花时间阅读我。
解决方案
使用 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 出现的次数。
推荐阅读
- javascript - 在jquery中的固定行数上添加/删除列
- javascript - 追加和推入数组时如何获取元素的值
- javascript - 如何修复错误:相邻的 JSX 元素必须包含在封闭标记中?在本机反应
- r - 当自变量满足条件时,循环遍历 GLM 模型中的因变量
- reactjs - npm 总是返回此错误“在 '...0.4.2 附近解析时 JSON 输入意外结束”:{“name”:“comma””
- c++ - 如何返回函数的参数个数?
- vue.js - “无法读取null的属性'0'”。是否可以在发生错误的视图中找出属性名称?
- html - 我正在尝试使用 res.sendFile 在 express 中显示一个 html 文件
- r - 使用 purrr 和 modify_if 替换嵌套的 ifelse
- macos - 如何解决arduino ide的“没有这样的xattr:com.apple.quarantine”错误和路径错误?