0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数据科学家需要掌握哪些几大命令行?

lviY_AI_shequ 来源:lp 2019-03-26 09:16 次阅读

对于许多数据科学家来说,数据操作起始于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)standardUTF_8iconv-fISO-8859-1-tUTF-8< input.txt >output.txt

有用的选项:

head -n 输出指定行

head -c 输出指定的字节

HEAD

如果你是重度Pandas的用户,那么你会对head很熟悉。通常在处理新数据时,我们想要做的第一件事就是了解究竟存在那些东西。这会引起Panda启动,读取数据,然后调用df.head() - 很费劲,至少可以说。head,不需要任何标志,将输出文件的前10行。head真正的能力在于彻查清除操作。 例如,如果我们想将文件的分隔符从逗号改变为pipe通配符。一个快速测试将是:head mydata.csv | sed 's/,/|/g'

#Printsoutfirst10linesheadfilename.csv#Printfirst3lineshead-n3filename.csv

有用的选项:

head -n 输出指定行

head -c 输出指定的字节

TR命令

Tr类似于翻译,它是基于文件清理的一个强大使用的工具。一个理想的用法是替换文件中的分隔符。

#将文件中的制表符分割转换成逗号cattab_delimited.txt|tr" "","comma_delimited.csv

Tr的另一个特性是在你的处理中设置上所有的[:class:]变量。包括:

[:alnum:]所有字母和数字[:alpha:]所有字母[:blank:]所有水平空白[:cntrl:]所有控制字符[:digit:]所有数字[:graph:]所有可打印的字符,不包括空格[:lower:]全部小写字母[:print:]所有可打印的字符,包括空格[:punct:]所有标点符号[:space:]所有的水平或垂直空格[:upper:]全部大写字母[:xdigit:]所有十六进制数字

可以将这些多样化的变量链接在一起,组成一个强大的程序。下面是一个基于字数统计的程序,用来检查你的README文件是否使用过度。

catREADME.md|tr"[:punct:][:space:]

另外一个例子用于正则表达式

#将所有的大写字母转换成小写catfilename.csv|tr'[A-Z]''[a-z]'

有用的选项:

tr -d删除字符

tr -s压缩字符

退格

换页

垂直选项卡

NNN八进制值为NNN的字符

WC

字数统计。它的价值主要体现在使用 -l参数可以进行行数统计。

#WillreturnnumberoflinesinCSVwc-lgigantic_comma.csv

个用这个工具来验证各个命令的输出实在方便。因此,如果我们要在文件中转换分隔符,然后运行 wc -l,验证总行数是相同的。如果不同,我们就知道一定是哪里出错了。

常用选项:

wc -c打印字节数

wc -m打印字符数

wc -L打印最长一行的长度

wc -w打印字数

SPLIT命令

文件大小可以有显著变化。根据工作的不同,拆分文件是有益的,就像split。基本用法如下:

#我们拆分这个CSV文件,每500行分割为一个新的文件new_filenamesplit-l500filename.csvnew_filename_#filename.csv#lsoutput#new_filename_aaa#new_filename_aab#new_filename_aac

两个地方很奇怪:一个是命名方式,一个是缺少扩展名。后缀约定可以通过-d标识来数字化。添加文件扩展名,你需要执行下面这个find命令。他会给当前文件夹下的所有文件追加.csv后缀,所以需要小心使用。

find.-typef-execmv'{}''{}'.csv;#lsoutput#filename.csv.csv#new_filename_aaa.csv#new_filename_aab.csv#new_filename_aac.csv

有效的选项:

split -b按特定字节大小拆分

split -a生成长度为N的后缀

split -x使用十六进制后缀分割

SORT & UNIQ

前面的命令是显而易见的:他们按照自己说的做。这两者提供了最重要的一击(即去重单词计数)。这是由于有uniq,它只处理重复的相邻行。因此在管道输出之前进行排序。一个有趣的事情是,sort -u将获得与sort file.txt | uniq相同的结果。

Sort确实对数据科学家来说是一种很有用的小技巧:能够根据特定的列对整个CSV进行排序。

#SortingaCSVfilebythesecondcolumnalphabeticallysort-t","-k2,2filename.csv#Numericallysort-t","-k2n,2filename.csv#Reverseordersort-t","-k2nr,2filename.csv

这里的-t选项是指定逗号作为分隔符。通常假设是空格或制表符。此外,-k标志是用来指定我们的键的。它的语法是-km,n,m是起始字段,n是最后一个字段。

有用的选项:

sort -f忽略大小写

sort -r逆序

sort -R 乱序

uniq -c计算出现次数

uniq -d只打印重复行

CUT命令

cut用于删除列。举个栗子,如果我们只想要第一列和第三列。

cut-d,-f1,3filename.csv

选择除了第一列以外的所有列

cut-d,-f2-filename.csv

与其他的命令组合使用,cut命令作为过滤器

#打印存在“some_string_value”的第1列和第3列的前10行headfilename.csv|grep"some_string_value"|cut-d,-f1,3

找出第二列中唯一值的数量。

catfilename.csv|cut-d,-f2|sort|uniq|wc-l#计算唯一值出现的次数,限制输出前10个结果catfilename.csv|cut-d,-f2|sort|uniq-c|head

PASTE

paste是个有趣的小命令。如果你想合并两个文件,而这两个文件的内容又正好是有序的,那 paste 就可以这样做。

#names.txtadamjohnzach#jobs.txtlawyeryoutuberdeveloper#JointhetwointoaCSVpaste-d','names.txtjobs.txt>person_data.txt#Outputadam,lawyerjohn,youtuberzach,developer

关于更多 SQL_-esque变体,请看下面。

JOIN

Join是一种简单的、准切向的SQL。最大的区别在于Join将返回所有列,匹配可能只发生在一个字段上。默认情况下,join将尝试使用第一列作为匹配键。对于不同的结果,需要以下语法:

#Jointhefirstfile(-1)bythesecondcolumn#andthesecondfile(-2)bythefirstjoin-t","-12-21first_file.txtsecond_file.txt

标准连接是一个内部连接。然而,外部连接也可以通过-af滞后来实现。另一个值得注意的是-e标志,如果发现有字段丢失,它可以用来替换成其他值。

#Outerjoin,replaceblankswithNULLincolumns1and2#-owhichfieldstosubstitute-0iskey,1.1isfirstcolumn,etc...join-t","-12-a1-a2-e'NULL'-o'0,1.1,2.2'first_file.txtsecond_file.txt

虽然它不是最容易使用的命令,但是在绝望的时刻,它就是唯一可用的措施。

常用的选项:

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 我们的命令可能在第一次出现旧值就会终止。

为了尽快了解它的能力,我们来看一个例子。在这个情况你会拿到下面的文件:

balance,name$1,000,john$2,000,jack

我们要做的第一件事就是移除美元符。-i 标识表示就地修改。''就是代表一个零长度文件扩展,因此重写我们的初始文件。理想情况下,你会单独测试这些并输出到一个新文件。

sed-i'''s/$//g'data.txt#balance,name#1,000,john#2,000,jack

下一步,我们的balance列的逗号。

sed-i'''s/([0-9]),([0-9])//g'data.txt#balance,name#1000,john#2000,jack

最终,Jack有一天起来并准备辞职了。所以,再见吧,我的朋友。

sed-i'''/jack/d'data.txt#balance,name#1000,john

就像你所看到的,sed功能强大,但是乐趣不止于此。

AWK

最好的放最后。Awk不仅是一个简单的命令:它是一个成熟的语言。在本文中包含的每一个命令中,awk目前是最酷的。如果你发现它令你印象深刻,这有大量的资源- 看这,这,和这。

awk包含的常用案例:

文本处理

格式化文本报告

执行计算操作

执行字符串操作

Awk在其最初雏形可以与grep平行。

awk'/word/'filename.csv

或者多使用一点魔法,让grep和cut结合。在这,awk对所有行通过word打印了以tab分隔的第三和第四列。-F,只是将分隔符变为逗号。

awk-F,'/word/{print$3" "$4}'filename.csv

Awk具有大量有用的内置变量。例如, NF -字段数 - 和NR - 记录数。为了获取文件中这53个记录:

awk-F,'NR==53'filename.csv

添加一个小窍门可以基于一个值或者多个值过滤。下面的第一个例子,会打印这些记录中第一列为string的行数和列。

awk-F,'$1=="string"{printNR,$0}'filename.csv#Filterbasedoffofnumericalvalueinsecondcolumnawk-F,'$2==1000{printNR,$0}'filename.csv

多数值表达式:

#Printlinenumberandcolumnswherecolumnthreegreater#than2005andcolumnfivelessthanonethousandawk-F,'$3>=2005&&$5<= 1000 { print NR, $0 } ' filename.csv

计算第三列之和:

awk-F,'{x+=$3}END{printx}'filename.csv

计算那些第一列值为“something”的第三列之和。

awk-F,'$1=="something"{x+=$3}END{printx}'filename.csv

获取文件的行数列数:

awk-F,'END{printNF,NR}'filename.csv#Prettierversionawk-F,'BEGIN{print"COLUMNS","ROWS"};END{printNF,NR}'filename.csv

打印出现过两次的行:

awk-F,'++seen[$0]==2'filename.csv

移除多行:

#Consecutivelinesawk'a!~$0;{a=$0}']#Nonconsecutivelinesawk'!a[$0]++'filename.csv#Moreefficientawk'!($0ina){a[$0];print}

使用内置函数gsub()替换多个值。

awk'{gsub(/scarlet|ruby|puce/,"red");print}'

这个awk命令合并了多个CSV文件,忽略头并在结尾追加。

awk'FNR==1&&NR!=1{next;}{print}'*.csv>final_file.csv

需要精简一个大文件?好的,awk可以在sed的帮助下完成这件事。具体来说,基于一个行数,这个命令将一个大文件分为多个小文件。这个一行文件也会添加一个扩展名。

sed'1d;$d'filename.csv|awk'NR%NUMBER_OF_LINES==1{x="filename-"++i".csv";}{print>x}'#Example:splittingbig_data.csvintodata_(n).csvevery100,000linessed'1d;$d'big_data.csv|awk'NR%100000==1{x="data_"++i".csv";}{print>x}'

结束前

命令行拥有无穷的力量。本文所涵盖的命令行知识足以让你从零基础到入门。除了这些已涉及的内容外,针对日常数据操作还有需要可考虑的实用程序。Csvkit,xsv和q是其中三个值得关注的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码
    +关注

    关注

    6

    文章

    835

    浏览量

    54457
  • 命令行
    +关注

    关注

    0

    文章

    75

    浏览量

    10344
  • 数据科学
    +关注

    关注

    0

    文章

    163

    浏览量

    9981

原文标题:数据科学家需要掌握的几大命令行骚操作

文章出处:【微信号:AI_shequ,微信公众号:人工智能爱好者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    在STM32实现命令行

    工作中的开发环境都是基于linux命令行交互,作为命令行的重度使用者,玩单片机也要使用命令行工具,百度了一些命令行工具,有几个不错的开源 cmd 交互工具,主要看了 finsh
    发表于 12-09 11:32 1623次阅读

    Linux命令行工具

    Linux 新手往往对命令行心存畏惧。部分原因是因为需要记忆大量的命令,毕竟掌握命令是高效使用命令行
    发表于 07-25 08:10

    cmd网络经典命令行

    cmd网络经典命令行:
    发表于 06-11 15:17 36次下载
    cmd网络经典<b class='flag-5'>命令行</b>

    caxa命令行中的应用

    caxa命令行中的应用 命令行对于大多用户来说往往只是输入数据的作用,但是其中的奥妙还有很多,下面就给大家
    发表于 10-18 18:18 2164次阅读

    博达环网配置命令行

    博达工业交换要环网配置命令行
    发表于 12-27 16:24 0次下载

    CMD的命令行高级教程

    CMD的命令行高级教程
    发表于 10-24 08:31 30次下载
    CMD的<b class='flag-5'>命令行</b>高级教程

    Linux图形界面的原理与构成和Linux命令行和vi编辑器的使用手册

    本文档的主要内容详细介绍的是Linux基础教案主要内容是:(1) 了解Linux图形界面的原理与构成;(2)掌握Linux命令行操作,包括:命令行界面、Shell基础、命令行使用;(3
    发表于 10-16 14:49 6次下载
    Linux图形界面的原理与构成和Linux<b class='flag-5'>命令行</b>和vi编辑器的使用手册

    Linux 命令行教程好书推荐

    LinuxCommand.org 创始人:William Shotts 之手。 在很早以前,该书便基于 CC 3.0 许可免费对外界开放阅读,发展到今天,已帮助无数开发者习得并掌握 Linux 命令行
    的头像 发表于 02-14 09:25 1247次阅读

    Shell命令行解释器简介

    Shell 是一个命令行解释器,Shell 为用户提供了与设备进行命令行交互的方式,用户通过串口、以太网、无线等方式将命令传输给具有 Shell 功能的设备,设备会解析命令并查找对应的
    的头像 发表于 08-19 17:20 2701次阅读

    Golang基于flag库实现一个命令行工具

    Golang 标准库中的 flag 库提供了解析命令行选项的能力,我们可以基于此来开发命令行工具。
    的头像 发表于 10-28 09:26 975次阅读

    Linux命令行与shell脚本编写

    Linux命令行与shell脚本编写
    发表于 01-11 16:50 4次下载

    一个开源MCU级的命令行交互组件

    一个开源MCU级命令行交互组件~
    的头像 发表于 10-17 16:26 191次阅读
    一个开源MCU级的<b class='flag-5'>命令行</b>交互组件

    linux虚拟机怎么调出命令行

    在Linux虚拟机中调出命令行界面,可以通过以下步骤实现: 打开虚拟机,进入到Linux系统。 在桌面或应用菜单中找到终端或命令行图标,点击打开。 输入命令行指令,执行相应的操作。 另外,也可以通过
    的头像 发表于 11-08 11:28 1643次阅读

    linux切换到命令行模式

    密码后,按回车键确认。 如果密码正确,您将被成功切换到命令行模式。 请注意,以上步骤仅适用于切换到纯命令行模式。如果您需要使用图形界面和命令行模式之间的切换,请使用init
    的头像 发表于 11-13 16:47 814次阅读

    idea如何输入命令行参数

    在许多软件开发和系统管理的任务中,我们经常需要向应用程序传递命令行参数。命令行参数是在运行时传递给程序的值,用于指定程序的行为和配置选项。本文将详细介绍如何在不同的编程语言和操作系统中输入命令
    的头像 发表于 12-06 15:01 364次阅读