数据科学家的命令行技巧
对于许多数据科学家来说,数据操作从始至终就是 Pandas 或 Tidyverse。从理论上讲,这样做没有任何问题。毕竟,这就是这些工具存在的原因。然而,对于像分隔符转换这样的简单任务,这些工具是大材小用了。
立志掌握命令行应该在每个开发人员的学习清单上,特别是数据科学家。学习 shell 的来龙去脉将无可否认地提高你的生产力。除此之外,命令行还是计算领域的一个重要历史课程。例如,awk —— 一种数据驱动的脚本语言。1977 年,在 Brain Kernighan(即传奇的 K&R 书中 K)的帮助下,awk 首次出现。今天,大约五十年过去了,awk 仍然活跃在每年新出版的书里面。因此,可以安全地假设对命令行魔法的付出不会很快贬值。
我们将涵盖什么
- ICONV
- HEAD
- TR
- WC
- SPLIT
- SORT & UNIQ
- CUT
- PASTE
- JOIN
- GREP
- SED
- AWK
ICONV
文件编码可能会很棘手。现在大部分文件都是 UTF-8 编码的。要了解 UTF-8 背后的一些魔力,请查看这个出色的视频。尽管如此,有时我们收到的文件不是这种编码。这可能引起对改变编码模式的一些胡乱尝试。这里,iconv
是一个拯救者。iconv
是一个简单的程序,它将获取采用一种编码的文本并输出采用另一种编码的文本。
1 |
|
实用选项:
iconv -l
列出所有已知编码iconv -c
默默丢弃无法转换的字符
HEAD
如果你是一个 Pandas 重度用户,那么会很熟悉 head
。通常在处理新数据时,我们想做的第一件事就是了解其内容。这就得启动 Pandas,读取数据然后调用 df.head()
—— 要说这有点费劲。没有任何选项的 head
将打印出文件的前 10 行。head
的真正力量在于干净利落的测试操作。例如,如果我们想将文件的分隔符从逗号更改为管道。一个快速测试将是:head mydata.csv | sed 's/,/|/g'
。
1 |
|
实用选项:
head -n
打印特定行数head -c
打印特定字节数
TR
tr
类似于翻译。这个功能强大的实用程序是文件基础清理的主力。理想的用例是替换文件中的分隔符。
1 |
|
tr
另一个功能是你可以用内建 [:class:]
变量(POSIX 字符类)发挥威力。这些包括了:
[:alnum:]
所有字母和数字[:alpha:]
所有字母[:blank:]
所有水平空白[:cntrl:]
所有控制字符[:digit:]
所有数字[:graph:]
所有可打印字符,但不包括空格[:lower:]
所有小写字母[:print:]
所有可打印字符,包括空格[:punct:]
所有标点符号[:space:]
所有水平或垂直空白[:upper:]
所有大写字母[:xdigit:]
所有 16 进制数字
你可以将这些连接在一起以组成强大的程序。以下是一个基本的字数统计程序,可用于检查 README 是否被滥用。
1 |
|
另一个使用基本正则表达式的例子:
1 |
|
实用选项:
tr -d
删除字符tr -s
压缩字符\b
退格\f
换页\v
垂直制表符\NNN
八进制字符
WC
单词计数。它的价值主要来自其 -l
选项,它会给你提供行数。
1 |
|
这个工具可以方便地确认各种命令的输出。所以,如果我们在转换文件中的分隔符之后运行 wc -l
,我们会期待总行数是一样的,如果不一致,我们就知道有地方出错了。
实用选项:
wc -c
打印字节数wc -m
打印字符数wc -L
打印最长行的长度wc -w
打印单词数量
SPLIT
文件大小的范围可以很广。对于有的任务,拆分文件或许是有好处的,所以使用 split
吧。split
的基本语法是:
1 |
|
它有两个奇怪的地方是命名约定和缺少文件扩展名。后缀约定可以通过 -d
标志变为数字。要添加文件扩展名,你需要运行以下 find
命令。它将通过附加 .csv
扩展名来更改当前目录中所有文件的名称,所以小心了。
1 |
|
实用选项:
split -b N
按特定字节大小分割split -a N
生成长度为 N 的后缀split -x
使用十六进制后缀
SORT & UNIQ
上面两个命令很明显:它们的作用就是字面意思。这两者结合起来可以提供最强大的冲击 (例如,唯一单词的数量)。这是由于 uniq
只作用于重复的相邻行。这也是在输出前进行 sort
的原因。一个有趣的事情是 sort -u
会达到和典型的 sort file.txt | uniq
模式一样的结果。
sort
对数据科学家来说确实具有潜在的有用能力:能够根据特定列对整个 CSV 进行排序。
1 |
|
这里的 -t
选项将逗号指定为分隔符,通常假设分隔符是空格或制表符。此外,-k
选项是为了确定我们的键。这里的语法是 -km,n
,m
作为开始列,n
作为结束列。
实用选项:
sort -f
忽略大小写sort -r
反向排序sort -R
乱序uniq -c
统计出现次数uniq -d
只打印重复行
CUT
cut
用于删除列。作为演示,如果我们只想删除第一和第三列。
1 |
|
要选择除了第一行外的所有行。
1 |
|
结合其他命令,将 cut
用作过滤器。
1 |
|
查出第二列中唯一值的数量。
1 |
|
PASTE
paste
是一个带有趣味性功能的特定命令。如果你有两个需要合并的文件,并且它们已经排序好了,paste
帮你解决了接下来的步骤。
1 |
|
更多 SQL 式变种,见下文。
JOIN
join
是一个简单的、 准切向的 SQL。最大的区别是 join
将返回所有列以及只能在一个字段上匹配。默认情况下,join
将尝试使用第一列作为匹配键。为了获得不同结果,必须使用以下语法:
1 |
|
标准的 join
是内连接。然而,外连接通过 -a
选项也是可行的。另一个值得一提的技巧是 -q
标志,如果发现有缺失的字段,可用于替换值。
1 |
|
它不是最用户友好的命令,而是绝望时刻的绝望措施。
实用选项:
join -a
打印不可配对的行join -e
替换丢失的输入字段join -j
相当于-1 FIELD -2 FIELD
GREP
grep
即 用正则表达式全局搜索并且打印 ,可能是最有名的命令,并且名副其实。grep
很强大,特别适合在大型代码库中查找。在数据科学的王国里,它充当其他命令的提炼机制。虽然它的标准用途也很有价值。
1 |
|
计算包含单词或模式的总行数。
1 |
|
对多个值使用“或”运算符: \|
。
1 |
|
实用选项:
alias grep="grep --color=auto"
使 grep 色彩丰富grep -E
使用扩展正则表达式grep -w
只匹配整个单词grep -l
打印匹配的文件名grep -v
非匹配
大人物们
sed
和 awk
是本文中最强大的两个命令。为简洁起见,我不打算详细讨论这两个命令。相反,我将介绍各种能证明其令人印象深刻的力量的命令。如果你想了解更多,这儿就有一本书是关于它们的。
SED
sed
本质上是一个流编辑器。它擅长替换,但也可以用于所有输出重构。
最基本的 sed
命令由 s/old/new/g
组成。它的意思是搜索 old
,全局替换为 new
。 如果没有 /g
,我们的命令将在 old
第一次出现后终止。
为了快速了解它的功能,我们可以深入了解一个例子。 在以下情景中,你已有以下文件:
1 |
|
我们可能想要做的第一件事是删除美元符号。-i
标志表示原位。''
表示零长度文件扩展名,从而覆盖我们的初始文件。理想情况下,你可以单独测试,然后输出到新文件。
1 |
|
接下来,去除 blance
列的逗号。
1 |
|
最后 jack 有一天决定辞职。所以,再见了,我的朋友。
1 |
|
正如你所看到的,sed
有很多强大的功能,但乐趣并不止于此。
AWK
最好的留在最后。awk
不仅仅是一个简单的命令:它是一个成熟的语言。在本文中涉及的所有内容中,awk
是目前为止最酷的。如果你感兴趣,这里有很多很棒的资源 —— 看 这里、这里 和 这里。
awk
的常见用例包括:
- 文字处理
- 格式化文本报告
- 执行算术运算
- 执行字符串操作
awk
可以以最原生的形式并行 grep
。
1 |
|
或者更加神奇:将 grep
和 cut
组合起来。在这里,对于所有带我们指定单词 word
的行,awk
打印第三和第四列,用 tab
分隔。-F,
用于指定切分时的列分隔符为逗号。
1 |
|
awk
内置了许多精巧的变量。比如,NF
—— 字段数,和 NR
—— 记录数。要获取文件中的第 53 条记录:
1 |
|
更多的花招是其基于一个或多个值进行过滤的能力。下面的第一个示例将打印第一列等于给定字符串的行的行号和列。
1 |
|
多个数值表达式:
1 |
|
求出第三列的总和:
1 |
|
在第一列等于 something
的那些行,求出第三列值的总和。
1 |
|
获取文件的行列数:
1 |
|
打印出现了两次的行:
1 |
|
删除重复的行:
1 |
|
使用内置函数 gsub()
替换多个值。
1 |
|
这个 awk
命令将组合多个 CSV 文件,忽略标题,然后在最后附加它。
1 |
|
需要缩小一个庞大的文件? awk
可以在 sed
的帮助下处理它。具体来说,该命令根据行数将一个大文件分成多个较小的文件。这个一行脚本将增加一个扩展名。
1 |
|
结语
命令行拥有无穷无尽的力量。本文中介绍的命令足以将你从一无所知提升到英雄人物。除了涵盖的内容之外,还有许多实用程序可以考虑用于日常数据操作。Csvkit、xsv 还有 q 是需要记住的三个。如果你希望更深入地了解命令行数据科学,查看这本书。它也可以免费在线获得!
via: http://kadekillary.work/post/cli-4-ds/
作者:Kade Killary 选题:lujun9972 译者:GraveAccent 校对:wxy