通常,在数据科学家的工作中,我必须将数据从一个视图转移到另一个视图,进行汇总,得到相同的粒度,然后清理数据,加载,卸载,分析,格式化和发送结果(通常也是某种形式的数据)。数据总是有问题,需要快速地来回驱动它们-最重要的是,经典的Unix实用程序和小型但引以为傲的工具可以帮助我实现这一点:今天我们将讨论它们。
今天将有一些示例和需要我使用它们的情况。此处和下文所述的一切都是真实的主观体验,当然每个人的情况都不同,但也许对某人有用。
工具-学习工具-编写的所有内容都是主观的,并且完全基于个人经验:它帮助了我,也许也将对您有所帮助。
在您开始阅读之前,我们提醒您,现在我们正在为kulkhackers玩我们的游戏,在其中您可以有时间赢钱...
Zsh和oh-my-zsh-在Bash工作了这么多年之后!
我现在记得,我17岁,安装了Linux。终端和重击。无论如何,bash始终是过程的一部分,并且对我来说是终端中实际工作的代表。博士学位毕业后的12年,我进入了一家有介绍性文件的公司,这是我第一次遇到罂粟花,因此我决定遵循它。
瞧!方便的文件夹导航,人工自动完成,git指示器,主题,插件,对python虚拟环境的支持等-现在我坐在终端机上,我并不为之高兴!
我们将zsh放到您通常放的所有东西上,然后转到oh-my-zsh(实际上,这是一个民间的食谱集,可以直接使用,并增加了对插件,主题等的支持)。你可以在这里拿走。您还可以放置一个主题(例如,嗯)。这是一个很好的可能性演示。来自这个文章在这里。
流水线
最好的终端设计之一是管道。简而言之,它允许您将一个命令的输出连接到另一个命令的输入,这是一个简单的应用程序示例,该示例实际上取自我两天前所做的任务。
有必要用一种语言模拟一个问题来解决组合问题,一切都从终端启动,并通过放置一个简单的图标|以绝对不可读的形式显示在文本中。 -连接的输入输出端和由格式支持:
| python.py format.py
一项更有趣且日常的任务是根据上传的数据评估一些参数或特征,通常这是一系列快速检查,以确保数据在服务器上某处的所需值表现良好-例如,我们想了解解析器的功能以及查看所有json文件中收集了多少个唯一组-该参数自然会随着时间的推移而适当增长:
cat data/*groups* | jq .group | uniq | wc -l
我们将进一步讨论它们中的每一个,但是总体思路已经很清楚了:
- cat-(连接的缩写)从数据/文件夹中打印名称中带有“ group”字样的文件的内容
- jq-从json中删除“ group”字段
- uniq-仅保留唯一组
- wc-使用-l开关来计算行数,即组数
现在,我们将仔细研究wc。
WC是一个小巧但引以为傲的实用程序,用于计算行,单词等。
wc-可以使用简单的按键快速读取单词,行,字母,字节和最大行长:
—bytes
—chars
—words
—lines
—max-line-length
看来这是微不足道的,但事实证明这常常是必需和方便的。
每天使用时,让我们快速估算一下我们收集了多少数据(这里是一行,一条记录):
更多细节在这里。
Ack / grep
已经写了成千上万的关于它们的手册和文章,但是我不禁提及-他们根据模式使用常规和自己的查询语言来提取文本。通常,在我看来,ack更友好,更易于使用,因此就在这里:
示例:在python源文件中快速找到单词(键“ -w”)ga2m(模型类型),不区分大小写(键-i) :
JQ-在命令行上解析json
文件资料。
JQ对于json来说是彻头彻尾的grep / ack(尽管稍加sed和awk-稍后再介绍)-实际上,命令行上有一个用于json和json行的简单解析器,但是有时它非常方便-以某种方式我必须解析wikidata档案在bz2格式中,它的重量约为100GB,未压缩的重量约为0.5TB。
有必要从中删除几个字段之间的对应关系,事实证明,这非常简单地在一台实际上没有CPU和内存负载的机器上完成,这是我使用的命令:
bzcat data/latest-all.json.bz2 | jq —stream 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")' | python3 scripts/post_process.py "output.csv"
本质上,整个管道创建了必要的映射,因为我们看到一切都在流模式下工作:
- bzcat阅读了档案的一部分并给了jq
- 带有-stream键的jq立即产生结果并将其传递给python中的后处理器(就像第一个示例一样)
- 在内部,后处理器是一个简单的状态机
总体而言,复杂的管道以流模式处理大数据(0.5TB),而没有大量资源,由一个简单的管道和几个工具组成。绝对会建议您在休闲时退房。
fzf-模糊查找器
最方便的事情(尤其是在wim中):快速搜索文件,这对于大型项目很方便-尤其是当您有多个文件时。通常,您需要在一个大型项目中按某个单词快速搜索文件:我沉浸在一个新项目中,该项目包含多个大型存储库,并且作为入门任务,我需要向系统中可用的分类中添加一个简单模型,我需要快速使用ga2m关键字查找文件,然后与其他“代码块”进行类比-快速编辑其中一个-在这里fzf非常有用:
链接到存储库。
AWK
该名称来自Aho,Weinberger和Kernighan的创建者的首字母:实际上,一种用于处理文本表数据的脚本语言-将转换模式应用于文件的每一行。
通常,它是快速一次性转换的理想选择,例如,我们以tsv的形式手工组装了一个数据集,并且处理器接收jsonl作为输入,并期望源文件中没有其他的“主题”字段(某些对当前计算不重要的事情是必需的)-总的来说,编写了一条简单的单行代码:
cat groups.tsv | awk '{ printf "{\"group\": \"%s\", \"theme\": \"manual\" }\n", $1 }' > group.jsonl
实际上,他拿了一个文件,并在每行中用必要的字段包装了json。
从教程链接。
wget-多功能命令行下载器
定期,脚本和管道必须从某个地方提取并下载某些内容-wget不会失败:它可以下载,登录,代理,Cookie,除了http(s)外,它还可以执行ftp。下载中的
瑞士刀。
HSTR-具有人脸的搜索命令历史记录
命令历史:hstr
定期我必须在命令历史中搜索某些内容:
- “我已经必须这样做了”
- “ X以什么键开头?”
- “但是这块可以重复使用”
因此,对我来说,在命令的历史记录中进行良好而便捷的搜索非常重要,而hstr完全可以完成其工作:
有用但不包括在内
在最后,我会提到有用的东西-但在该主题的另一篇文章中-看起来很有用:
- SSH + tmux + vim(neo,插件等)
- 命令行git + git hooks的基本知识
- Data pipeline construction make/just
- Python virtual environments
- Docker