自在城财经

例如,如下sed 命令将在任何给定的行上查找两个带引号的字符串

简介: 例如,如下sed 命令将在任何给定的行上查找两个带引号的字符串,然后交换它们的位置而不改变文本的任何其他部分,并替换for为in,同时将引号更改为括号:echo 'There are many useful "Lin

除了Mathlab,Scilab,Jupyter,IPython notebook和NumPy,R语言,Julia语言等等,其实还有一个值得重视的工具(集),那就是Linux Shell。

管道,重定向和tee常用Linux同学一定非常熟悉“|” 符号,这就是shell管道。

cat example.txt | awk -F',' '{print $1}' | sort | uniq -c > tongji.txt'<' 符号是一个输入重定向符号,可以将文件的内容重定向到标准入。

grep xxx < example.txttee上面个说了一栈式流水处理,但是我们在流式处理的同时,有希望将某个输出保留下。

这就要用到tee命令,和其字面意思 “三通”一样,tee命令是让将流信息传递个管道的同时还可以保存到文件。

./cc.sh | tee cc.log在数据科学中'tee'实际上并不能做任何分析,但如果调试复杂的shell管道为啥不能正常工,用tee非常有用。

举一个上面的例子,并在管道的每个阶段之间放置对“tee”命令的引用:cat example.csv | tail -n +2 | tee after_tail.log | awk -F',' '{print $1}' | tee after_awk.log | sort | tee after_sort.log | uniq -c | tee after_uniq.log运行此命令时会生成4个日志文件,这些日志文件记录整个管道流水过程中每个阶段的输出情况。

Grep默认 “面向行”处理,当找到匹配的文本时,grep将打印该行上的所有文本,可以使用“-o”标志仅打印匹配的部分线。

比如要从巨大(几十G)的Web服务器日志中过滤对特定网页的访问,或者在代码库中搜索特定关键字的实例;Grep对于临时数据科学任务非常有用,它允许快速地从数据集中过滤出想要的信息。

如果数据存储在文本文件中的各个行上,如果能想到一个非常精确的搜索规则来过滤掉它们,则可以使用grep仅提取想要使用的行。

例如,如果有以下example.csv文件,每一行都包含一条销售记录:名称, 型号,价格, 税球鞋, MN009, 49.99, 1.11球鞋, MTG09, 139.99, 4.11T恤, MN089, 28.99, 1.44短裤, N09, 39.99, 1.11球鞋, KN09, 49.99, 1.11皮鞋, BN009, 449.22, 4.31球鞋, dN099, 149.99, 1.22香蕉, GG009, 4.99, 1.11要筛选出包含文本球鞋的销售记录:grep 球鞋 example.csv对于复杂的搜索可以使用正则表达式。

例如要过滤掉所有以'BN'或'MN'开头且后跟至少3个数字的型号:grep -o "\(BN\|MN\)\([0-9]\)\{3\}" example.csv结果为:MN009MN089BN009Sedsed 是shell文本三剑客之一,一个用于执行搜索和替换操作的工具。

例如,可以使用一条很简单命令:sed -i 's/cc/CC/g' *将当前目录中所有文件中的cc一词的所有实例替换为CC。

例如,如下sed 命令将在任何给定的行上查找两个带引号的字符串,然后交换它们的位置而不改变文本的任何其他部分,并替换for为in,同时将引号更改为括号:echo 'There are many useful "Linux shell" tools for "DATA Science".' | sed -E 's/"([^"]+)"([^"]+)"([^"]+)"/(\3)\2(\1)/;s/for/in/'结果如下:There are many useful (DATA Science) tools in (Linux shell).在数据科学中sed的最大用例是规范化数据格式用于进行数据清洗和规范。

例如,有一个文本文件“data.txt”,其中包含数千个用双引号括起来的数字:age,value"33","5943""32","543""34","93""39","5943""36","9943""38","8943"可以通过以下sed命令运行进行处理:cat data.csv | sed 's/"//g'结果就都变成规范的数字:age,value33,594332,54334,9339,594336,994338,8943如果遇到过一些简单的格式错误导致导入失败或无法正确处理的数据集问题,可以尝试用sed进行数据预处理。

awkawk也shell文本三剑客之一,可以进行更高级的搜索和替换操作,这些操作可能需要通用计算。

假设温度值数据文件“temps.csv”,其数据单位混合使用可摄氏度或华氏度,为了统一需要需要将华氏温度转化为摄氏温度:Cat temps.csv温度,单位26.1,C78.1,F23.1,C25.7,C76.3,F77.3,F24.2,C79.3,F27.9,C75.1,F25.9,C79.0,F可以使用一个简单的awk命令来完成该操作:cat temps.csv | awk -F',' '{if($2=="F")print (($1-32)*5/9)",C";else print $1","$2}'结果为:将所有温度值都统一为摄氏温度。

但是如果要筛选出其他数据任务中统计最大/最小的时候,就需要先对其进行排序,然后取第一个或最后一个。

现有一个文本文件example.txt,我们用sort进行排序:1123411ZZZZ10100123hello 虫虫abc123Hello chongchong9zzzz首先默认不加任何参数情况下排序:sort example.txt结果是:默认排序是按字母表顺序而不是数字顺序进行的,因此数字可能不是期望的顺序。

另一个常见的需求是反序排序,可以使用“-r”参数来实现:sort -r example.txt结果:数据科学中,sort一般结合comm、uniq 等配合使用,先用sort对输入数据进行排序。

拓扑排序是解决可能每天都在不知不觉中遇到的许多现实问题的方法 一个非常著名的例子是制定一个计划来完成许多任务,而这些任务必须在前一任务完成后才能开始。

在日常应用中,这样的依赖条件需求是常见的。

假设有任务的列表example.tk:吃饭 睡觉睡觉 打豆豆吃饭 打豆豆随便 打豆豆在上面的文件中,每一行由两个单词组成。

tsort example.tk结果如下:吃饭随便睡觉打豆豆可以在 sort -R 标志来获得文件中行的随机排序。

如果对依赖项列表进行重复的随机排序并将其通过管道传输到tsort,会注意到结果始终相同,即使“sort -R”的输出每次都不同:sort -R example.tk | tsort即使每次重新排列任务相互依赖的实际顺序也不会改变。

计数和统计commcomm 是一种基于输入文件中的文本行计算集合运算结果的工具(并集、交集和补集)。

假设有两个包含电子邮件地址数据,其中一个列表mail.txt的文件,其中包含注册电子邮件地址:另是sale.txt文件,其中包含购买人的电子邮件地址:现在想知道1) 哪些注册邮箱并购买产品的用户?

首先是问题1:comm -12 email.txt sale.txt结果:问题2:comm -23 email.txt sale.txt产生以下结果:最后,是问题3:comm -13 email.txt sale.txt产生以下结果:注意comm 命令要求其内容是排序后的。

如果文件未排序就会提示错误:comm: file 1 is not in sorted ordercomm: file 2 is not in sorted order可以在结合输入重定向和sort首先处理,然后在用comm:comm -12 <(sort email.txt) <(sort sale.txt)uniquniq命令是对数据进行去重(并计数)的工具,uniq和sort通常一起使用。

要知道每个项目重复次数,用uniq -c。

可以使用awk获取产品并将结果通过管道传输到sort和uniqawk -F',' '{print $1}' sales.csv | sort | uniqT恤球鞋短裤袜子要知道每个产品卖出去的件数,也可以awk -F',' '{print $1}' sales.csv | sort | uniq –c1 T恤2 球鞋2 短裤3 袜子可以使用-d标志,获取多次出现的项目列表。

Wcwc命令是一个工具,获得文本文件的单词数和行数。

在数据科学中wc使用的很频繁,比如统计列表的次数,比如要获得email文件中的邮件数(行数):wc -l email.csv结果中减去一个(如果文件中包含csv标头)就是邮件数。

如果要统计多个文件,支持使用通配符:wc -l *.csv计算一段文本或文件中的字符数通常很有用。

甚至可以将文本粘贴到echo语句中(使用 -n 来避免换行符计数):echo -n "There are so many cool tools in linux shell " | wc -c结果:44head和tailhead命令打印出文件的前几行(或字节)。

如果想查看一个巨大文件的一小部分,或者如果想从分析的另一部分计算top 3结果之类的结果,用head 非常好用,通常结合sort使用(xxx|sort|uniq|sort-nr|head -n 3)对于我们的产品销售文件sales.csv:想知道:“从最受欢迎到最不受欢迎的前3名畅销产品是什么?

可以使用:awk -F',' '{print $1}' sales.csv | sort | uniq -c | sort -nr | head -n 3上述脚本中,先用awk取出销售文件中的第一列即销售产品列表,然后对其排序(必须),然后uniq去重并计数,然后根据uniq计数数字按照逆袭排序,然后取出前三项,即Top 3.结果:3 袜子2 短裤2 球鞋Tail和 head相反,取出结尾的n行数据。

更常用的用例是tail -f动态输出最新的变化的内容。

以及用于清理数据文件中一些行,比如一般csv文件的第一行为标头行在数据处理中需要去除,可以用tail -n +2 就可以。

例如,有时可能会遇到使用空字符分隔而不是换行符的二进制数据。

则可以使用tr命令用换行符替换文件中的所有空字符:echo -en "\0" | tr \\0 \\n | xxd注意,上面命令中的双 '\' 字符是必需的,因为tr期望“\0”表示空字符,但 '\'本身在shell中需要进行转义。

上面的命令显示了通过管道传输到 'xxd'中的结果。

Catcat是shell最常用的一个工具,用于显示文件的内容。

当需要将多个文件拼接在一起,或者想将文件输出到标准输出时,cat 命令非常有用。

在执行数据科学任务时,cat常用于串联多个文件的数据。

比如对于多个具有类似格式内容的csv文件时,可以使用cat聚合到一起。

cat a.csv b.csv c.csv | awk -F'\t' '{print $1}' | sort | uniq当然最常用的用例是cat abc.txt | commandFindfind'命令可以使用许多不同的选项来搜索文件,它还能够对每个文件执行命令。

find 命令对于在给定许多不同选项(文件/目录类型、文件大小、文件权限等)的情况下搜索文件很有用,但它最有用的功能之一,是其-exec选项,它允许对找到文件,批量执行命令进行处理。

说明如何使用 find 命令列出当前目录中和当前目录下的所有文件:find . -type f -exec cat {} \; | wc -l带有 find 命令的“-exec”选项的语法可能是最难记住的语法之一,因为它不是在其他地方重复的常见模式。

下面是如何使用 find 命令将当前目录中和当前目录下的每个文件中的单词 'dog' 替换为单词 'cat' 的另一个示例:find . -type f -exec sed -i 's/dog/cat/g' {} \;可以通过更改 '.' 在当前目录以外的另一个特定目录上运行与上述命令类似的命令。

请小心使用find 的“-exec”执行,尤其是以 root 身份运行时。

如果不小心对“/”目录运行了错误的命令,可能会造成很大的损害。

有时候如果使用 grep 搜索文件时,得不到预期结果,但是cat时候明明有数据的,这是可以用zzd用十六进制形式查看文件:xxd sometext.txt给出以下输出:00000000: fffe 4800 6500 6c00 6c00 6f00 2000 5700 ..H.e.l.l.o. .W.00000010: 6f00 7200 6c00 6400 2100 0a00 o.r.l.d.!...可以发现文件“somefile.txt”以UTF-16 编码,但终端(可能)默认为UTF-8。

将UTF-16编码文本中的字符打印到UTF-8编码终端并没有显示出明显的问题。

但是用grep搜索Hello时,键入的字符将被解释为当前在终端环境中设置的字符编码(可能设置为 UTF-8). 因此,搜索字符串在这些 ASCII 字符之后不包含额外的空字节,因此搜索失败。

如果你想搜索UTF-16字符,可以使用:grep -aP "H\x00e\x00l\x00l\x00o\x00" * sometext.txt'a' 标志是打开二进制文件搜索所必需的,因为UTF-16中的空字符会导致文件被grep解释为二进制文件。

或者,如果知道给定文件是UTF-16,可以先将其转换为UTF-8格式,则可以使用以下命令执行此操作:iconv -f UTF-16 -t UTF-8 sometext.txt > sometext-utf-8.txt现在在处理此文件时无需采取任何特殊步骤,编码与当前终端编码兼容:00000000: 4865 6c6c 6f20 576f 726c 6421 0a Hello World!.结论正如本文中提到的(非全部),有大量的Linux shell工具命令对于快速解决数据科学问题非常有用。

本文只为每个命令展示一些用例,抛砖引玉,希望大家探索很多的shell工具来解决数据问题。


以上是文章"

例如,如下sed 命令将在任何给定的行上查找两个带引号的字符串

"的内容,欢迎阅读自在城财经的其它文章