简单快捷的数据处理,数据科学需要注意的命令行
作者:CQITer小编 时间:2018-05-30 09:29
命令行应该是每个开发者都希望掌握的,尤其是数据科学家。熟悉终端的来龙去脉可以毫无疑问地可以让我们变得更加有效率,因此命令行还是计算机技术中的一个很棒的历史课。例如,awk 这个数据驱动的脚本语言是 1977 年在 Brina Kernighan 的帮助下首次出现的,Brina Kernighan 就是 K&R 这本书中的 K。在 50 年后的今天,每年仍然能够出现与 awk 相关的新书。因此,我们可以相对保守地假设:一项针对命令行才能的投资在任何新近的时间内都不会贬值。

ICONV(用来转换文件的编码方式)
文件编码可能是比较棘手的。现在的多数文件都是 UTF-8 编码,然而有时候我们拿到的文件并不是这个格式的。这可能导致交换编码格式时的一些不靠谱的尝试。这里,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 的用户,那么你会比较熟悉 df.head()。默认情况下 head 命令显示文件的前 10 行内容,当然我们也可以选择不同的参数确定打印的行数或字符数。
# Prints out first 10 lines
head filename.csv
# Print first 3 lines
head -n 3 filename.csv
可选参数:
head -n <数字> 打印特定数目的行数
head -c <字符数> 打印特定数目的字符
TR(对字符进行替换、压缩和删除)
tr 与转译比较类似,它的强大能力是文件清理的主要工具。例如以下交换文件中的分隔符:
# Converting a tab delimited file into commas
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 README.md | tr "[:punct:][:space:]" "\n" | tr "[:upper:]" "[:lower:]" | grep . | sort | uniq -c | sort -nr
使用基本正则表达式的另一个例子是:
# Converting all upper case letters to lower case
cat filename.csv | tr '[A-Z]' '[a-z]'
可选参数:
tr -d 删除字符
tr -s 压缩字符(将连续重复的字符用一个字符表示)
\b 空格
\f 换页符
\v 垂直制表符
\NNN 八进制字符 NNN
WC(用来计数的命令)
它的值主要来自于 -l flag,它会提供文档的行数。
# Will return number of lines in CSV
wc -l gigantic_comma.csv
这个工具可以方便地确认各种命令的输出。所以,如果我们转换了文件中的分隔符,那么运行 wc -l 就可以查看总行数是不是相同,不同就是出了问题。
可选参数:
wc -c 打印 Bytes 数目
wc -m 打印出字符数
wc -L 打印出最长行的字符数
wc -w 打印出单词数目
SPLIT(把一个大文件分割成小文件的命令)
文件大小可以使用这个命令大幅度改变。根据任务的不同,分割文件可能会有所帮助,所以就有了 split 命令。split 的基本语法如下:
# We will split our CSV into new_filename every 500 lines
split -l 500 filename.csv new_filename_
# filename.csv
# ls output
# new_filename_aaa
# new_filename_aab
# new_filename_aac




