摘要:对于许多数据科学家来说,数据操作起始于Pandas或Tidyverse.从理论上看,这个概念没有错。
对于许多数据科学家来说,数据操作起始于Pandas或Tidyverse.从理论上看,这个概念没有错。毕竟,这是为什么这些工具首先存在的原因。然而,对于分隔符转换等简单任务来说,这些选项通常可能是过于重量级了。
有意掌握命令行应该在每个开发人员的技能链上,特别是数据科学家。学习shell中的来龙去脉无可否认地会让你更高效。除此之外,命令行还在计算方面有一次伟大的历史记录。例如,awk - 一种数据驱动的脚本语言。Awk首次出现于1977年,它是在传奇的K&R一书中的K,Brian Kernighan的帮助下出现的。在今天,大约50年之后,awk仍然与每年出现的新书保持相关联! 因此,可以肯定的是,对命令行技术的投入不会很快贬值的。
我们会谈及的内容
ICONV
HEAD
TR
WC
SPLIT
SORT & UNIQ
CUT
PASTE
JOIN
GREP
SED
AWK
ICONV
文件编码总是棘手的问题。目前大部分文件都是采用的 UTF-8 编码。要想了解 UTF-8 的魔力,可以看看这个优秀的视频。尽管如此,有时候我们还是会收到非 UTF-8 编码的文件。这种情况下就需要尝试转码。iconv 就是这种状况下的救世主。iconv 是一个简单的程序,可以输入某种编码的文本,然后以另一种编码输出。
# Converting -f (from) latin1 (ISO-8859-1)
# -t (to) standard UTF_8
iconv -f ISO-8859-1 -t UTF-8 < input.txt > output.txt
常用选项:
iconv -l 列出所有支持的编码
iconv -c 不作提示就丢弃无法转换的字符
HEAD
如果你是重度Pandas的用户,那么你会对head很熟悉。通常在处理新数据时,我们想要做的第一件事就是了解究竟存在那些东西。这会引起Panda启动,读取数据,然后调用df.head() - 很费劲,至少可以说。head,不需要任何标志,将输出文件的前10行。head真正的能力在于彻查清除操作。 例如,如果我们想将文件的分隔符从逗号改变为pipe通配符。一个快速测试将是:head mydata.csv | sed 's/,/|/g'
# Prints out first 10 lines
head filename.csv
# Print first 3 lines
head -n 3 filename.csv
有用的选项:
head -n 输出指定行
head -c 输出指定的字节
TR命令
Tr类似于翻译,它是基于文件清理的一个强大使用的工具。一个理想的用法是替换文件中的分隔符。
#将文件中的制表符分割转换成逗号
cat tab_delimited.txt | tr "\t" "," comma_delimited.csv
Tr的另一个特性是在你的处理中设置上所有的[:class:]变量。包括:
[:alnum:] 所有字母和数字
[:alpha:] 所有字母
[:blank:] 所有水平空白
[:cntrl:] 所有控制字符
[:digit:] 所有数字
[:graph:] 所有可打印的字符,不包括空格
[:lower:] 全部小写字母
[:print:] 所有可打印的字符,包括空格
[:punct:] 所有标点符号
[:space:] 所有的水平或垂直空格
[:upper:] 全部大写字母
[:xdigit:] 所有十六进制数字
可以将这些多样化的变量链接在一起,组成一个强大的程序。下面是一个基于字数统计的程序,用来检查你的README文件是否使用过度。
另外一个例子用于正则表达式
# 将所有的大写字母转换成小写
cat filename.csv | tr '[A-Z]' '[a-z]'
有用的选项:
tr -d删除字符
tr -s压缩字符
\b退格
\f换页
\v垂直选项卡
\NNN八进制值为NNN的字符
WC
字数统计。它的价值主要体现在使用 -l 参数可以进行行数统计。
# Will return number of lines in CSV
wc -l gigantic_comma.csv
个用这个工具来验证各个命令的输出实在方便。因此,如果我们要在文件中转换分隔符,然后运行 wc -l,验证总行数是相同的。如果不同,我们就知道一定是哪里出错了。
常用选项:
wc -c 打印字节数
wc -m 打印字符数
wc -L 打印最长一行的长度
wc -w 打印字数
SPLIT命令
文件大小可以有显著变化。根据工作的不同,拆分文件是有益的,就像split.基本用法如下:
#我们拆分这个CSV文件,每500行分割为一个新的文件new_filename
前面的命令是显而易见的:他们按照自己说的做。这两者提供了最重要的一击(即去重单词计数)。这是由于有uniq,它只处理重复的相邻行。因此在管道输出之前进行排序。一个有趣的事情是,sort -u将获得与sort file.txt | uniq相同的结果。
Sort确实对数据科学家来说是一种很有用的小技巧:能够根据特定的列对整个CSV进行排序。
这里的-t选项是指定逗号作为分隔符。通常假设是空格或制表符。此外,-k标志是用来指定我们的键的。它的语法是-km,n,m是起始字段,n是最后一个字段。
有用的选项:
sort -f 忽略大小写
sort -r 逆序
sort -R 乱序
uniq -c 计算出现次数
uniq -d 只打印重复行
CUT命令
cut用于删除列。举个栗子,如果我们只想要第一列和第三列。
cut -d, -f 1,3 filename.csv
选择除了第一列以外的所有列
cut -d, -f 2- filename.csv
与其他的命令组合使用,cut命令作为过滤器
#打印存在“some_string_value”的第1列和第3列的前10行
head filename.csv | grep "some_string_value" | cut -d, -f 1,3
找出第二列中唯一值的数量。
cat filename.csv | cut -d, -f 2 | sort | uniq | wc -l
# 计算唯一值出现的次数,限制输出前10个结果
cat filename.csv | cut -d, -f 2 | sort | uniq -c | head
PASTE
paste 是个有趣的小命令。如果你想合并两个文件,而这两个文件的内容又正好是有序的,那 paste 就可以这样做。
Join是一种简单的、准切向的SQL.大的区别在于Join将返回所有列,匹配可能只发生在一个字段上。默认情况下,join将尝试使用第一列作为匹配键。对于不同的结果,需要以下语法:
标准连接是一个内部连接。然而,外部连接也可以通过-af滞后来实现。另一个值得注意的是-e标志,如果发现有字段丢失,它可以用来替换成其他值。
虽然它不是最容易使用的命令,但是在绝望的时刻,它就是唯一可用的措施。
常用的选项:
join -a 打印未成对的行
join -e 替换缺失字段
join -j 等同于 -1 FIELD -2 FIELD
GREP
全局搜索正则表达式并输出,或使用grep;可能是最知名的命令,并且有很好的理由。 Grep具有很强的能力,特别是在大型代码库中查找方法。在数据科学领域,它充当了其他命令的改进机制。但其标准用法也很有用。
# 递归搜索并列出当前目录下包含'word'的所有文件
grep -lr 'word' .
# 列出包含word的文件数目
grep -lr 'word' . | wc -l
对包含word/pattern的行数进行计数
grep -c 'some_value' filename.csv
# 同样的功能,但是按照文件名列出当前目录下所有包含该关键词的文件
grep -c 'some_value' *
Grep使用or运算符- \|来检索多个值。
grep "first_value\|second_value" filename.csv
有用的选项
alias grep="grep ——color=auto" 使grep支持彩色输出
grep -E 使用扩展正则表达式
grep -w 仅匹配完整单词
grep -l 打印匹配文件的名称
grep -v 倒序匹配
大杀器
Sed和Awk是本文两个最有用的命令。为了简洁,我不会讨论那些令人费解的细节。相反,我会讨论各种各样的命令来证明他们令人印象深刻的实力。如果你想了解的更多,这本书就可以。
SED
在内核中sed是一个流编辑器。它擅长替换,但是也可以用来重构。
最基本的sed命令包含了s/old/new/g.也就是全局搜索旧值,替换新值。没有/g 我们的命令可能在第一次出现旧值就会终止。
为了尽快了解它的能力,我们来看一个例子。在这个情况你会拿到下面的文件:
好的放最后。Awk不仅是一个简单的命令:它是一个成熟的语言。在本文中包含的每一个命令中,awk目前是最酷的。如果你发现它令你印象深刻,这有大量的资源- 看这,这,和这。
或者多使用一点魔法,让grep和cut结合。在这,awk对所有行通过word打印了以tab分隔的第三和第四列。-F,只是将分隔符变为逗号。
Awk具有大量有用的内置变量。例如, NF -字段数 - 和NR - 记录数。为了获取文件中这53个记录:
添加一个小窍门可以基于一个值或者多个值过滤。下面的第一个例子,会打印这些记录中第一列为string的行数和列。
需要精简一个大文件?好的,awk可以在sed的帮助下完成这件事。具体来说,基于一个行数,这个命令将一个大文件分为多个小文件。这个一行文件也会添加一个扩展名。
结束前
命令行拥有无穷的力量。本文所涵盖的命令行知识足以让你从零基础到入门。除了这些已涉及的内容外,针对日常数据操作还有需要可考虑的实用程序。Csvkit, xsv和q是其中三个值得关注的。如果你希望进一步深入到命令行的数据科学领域,那么请看此书。它也可以在此免费获得!
关注中国IDC圈官方微信:idc-quan 我们将定期推送IDC产业最新资讯
查看心情排行你看到此篇文章的感受是: