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

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

3天内不再提示

那些常用的 Unix 命令,你不知道的功能!

Linux爱好者 来源:YXQ 2019-08-11 10:04 次阅读

我逐渐意识到,Unix 的命令行工具可以解决一切与文字处理有关的问题。我来讲一个我遇到过的问题,以及怎样用 Unix 命令行工具解决的。

问题

我在做我的硕士论文研究。像许多统计学家一样,我需要进行许多模拟。首先我利用一些数字的种子(以保证可复现性)来模拟了一些数据,然后在这些数据上用一个算法来估算一些东西。每次运行模拟时我都会创建一些文件,大概像下面这样:

dataset-directory/0001_data.csvdataset-directory/0001_A.csv

但有时候运行会失败。这并不是太严重,模拟失败了我只需要运行另一个模拟就好了。比如,0001 这个数据我成功地运行了算法 A。因此我想在 0001 数据上使用算法 B。但我真正需要的是跟踪哪些命令失败了。

在许多数据上运行算法 A 之后,我得到了一大堆文件,像这样:

dataset-directory/0001_data.csvdataset-directory/0001_A.csvdataset-directory/0002_data.csvdataset-directory/0002_A.csvdataset-directory/0003_data.csvdataset-directory/0003_A.csvdataset-directory/0004_data.csvdataset-directory/0005_data.csvdataset-directory/0005_A.csvdataset-directory/0006_data.csvdataset-directory/0006_A.csvdataset-directory/0007_data.csvdataset-directory/0007_A.csvdataset-directory/0008_data.csvdataset-directory/0009_data.csvdataset-directory/0009_A.csv...dataset-directory/0499_A.csv

通过观察得知算法 A 在数据 0004 和 0008 上的结果不存在。那么,怎样才能列出所有 A 没有成功的数据呢?

我当然可以手工来做,但那样很容易出错,而且很麻烦。要是能写程序完成就最好了!

解决方案

简单地来说,那些没有成功的就是从0001到0500的数字中去掉那些成功了的数字。而得到数字列表的最好命令就是 seq:

$>seq1012345678910

(如果只给出一个数字,那么默认序列从1开始。当然,seq 2 10也会按照你期待的那样工作。)

现在,如果我能获得成功运行的列表,就可以通过 seq 命令生成所有可能的数字,再交叉检查两个列表来获得想要的结果了!

许多命令行工具只完成一项工作。例如,cut 可以获得每行指定位置上的字符:

$>cattextLoremipsumdolorsitamet$>cattext|cut-c2-5oremolor

注意这里使用了所谓的“管道运算符” | 。我说过,许多工具只做一件事,而且把那件事做到最好。很方便的是这些工具可以组合使用。使用管道,左边命令的结果就会变成右边命令的输入。注意这些命令会将输入当做一系列行来处理,通常来说这非常方便。

我们可以把成功的文件名单列表利用管道输入至 grep 命令,该命令可以使用正则表达式来查找。由于所有文件都以同样长度的四个数字开始,我们可以利用正则表达式 dddd 来匹配这四个连续的数字,然后将文件末尾的 A 算法加到正则表达式中。要获得文件列表,每行一个文件,只需执行 ls。(尽管直接调用 ls 时并不会显示成每行一个文件,但放在管道中时输出就会变成这样。)

$>lsdataset-directory|grep'dddd_A.csv'0009_A.csv0001_A.csv0002_A.csv0005_A.csv0007_A.csv0003_A.csv0006_A.csv...

出于某些原因,在使用 grep 之后这里的顺序混乱了。我们可以使用 sort 命令来改正。而且由于我们只关心数字,可以使用 cut -c 1-4 来取出数字部分。

$>lsdataset-directory|grep'dddd_A.csv'|sort|cut-c1-40001000200030005000600070009...0499

这些数字跟 seq 命令的结果不太一样,因为它们前面补了零。我们可以使用一段 Python 脚本将它们转成整数。

#parse.pyimportsysforlineinsys.stdin:i=int(line)print(i)

现在将结果用管道导入这个脚本就能得到我们需要的数字:

$>lsdataset-directory|grep'dddd_A.csv'|cut-c1-4|python3parse.py1235679...499

接近目标了!现在需要找出怎样才能交叉检查这两个数字的列表。幸运的是,有个命令叫做comm,它能检查两个输入流中的公共字符。为了将上面这个命令的输出作为输入使用,我们可以将其求值后重定向,只需使用<(...)即可实现:

$>comm<(ls dataset-directory | grep 'dddd_A.csv' | cut -c 1-4 | python3 parse.py) <(seq 500)        1        2        3    4        5        6        7    8        9    10...    500

这个输出不是太好理解。阅读 comm 的手册(运行 man comm)可以发现,comm 会“产生三列的输出,分别是:只存在于 file1 的行,只存在于 file2 的行,以及存在于两个文件的行”。要去掉第一列(其实它是空的,因为没有任何数字只存在于文件列表中),可以在调用 comm 时加入参数-1。我们也不关心同时存在于两个输入中的数字,因此还要传递标志-3。

$>comm-1-3<(ls dataset-directory | grep 'dddd_A.csv' | cut -c 1-4 | python3 parse.py) <(seq 500)48...500

搞定!

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

    关注

    23

    文章

    4446

    浏览量

    90709
  • UNIX
    +关注

    关注

    0

    文章

    294

    浏览量

    41052

原文标题:程序员,你真的会用 Unix 命令?

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    UNIX常用命令

    UNIX常用命令
    发表于 08-20 23:29

    试试功能,真的不知道怎么用

    试试功能,真的不知道怎么用
    发表于 02-18 15:59

    说说身边的那些行业我们不知道的事!

    的,或者照人家抄袭的。所以相对来说,应该还是去信任一些大厂家吧。11.一些添加剂其实是安全的,只要别放的太多。12.超市里面的捆绑牛奶或酸奶基本都是快过期的。13.羊毛都是出在羊身上,只是羊常常不知道
    发表于 04-12 11:44

    不知道的AD功能

    不知道的AD——SmartPaste功能
    发表于 12-30 16:31

    自动焊锡机那些不知道的事

    自动焊锡机那些不知道的事
    发表于 05-11 06:08

    不知道电动车电池的型号怎么办?

    不知道电动车电池的型号怎么办?  近一年来给很多人换过电动车电池了,我发现大多数人都不知道自己的电动车电池是什么型号的,
    发表于 11-11 08:56 3207次阅读

    Miniplayer小技巧 保证有你不知道

    Miniplayer小技巧 保证有你不知道的 1,用电源充电完成后先别拔充电器,先按住开关别放再拔开线就不用更新歌曲库了。
    发表于 02-01 16:38 642次阅读

    深扒:iPhone7那些不知道的事!

    和往年一样,今年的苹果旗舰如期而至,采用双旗舰设置,分别为4.7寸的iPhone7和5.5寸的iPhone7 Plus。那些升级和变化诸如升级了芯片到A10,取消了3.5mm耳机接口,Home键采用压力式设计和双摄像头等等我们就不多说了,接下来我们说一说你不知道的事。
    发表于 11-28 08:43 708次阅读

    绝对有你不知道的iOS自身小技巧!

    ​iOS本身就是一个很流畅,很人性化的系统,但是功能多,一般使用的人有些功能不知道如何使用。小编找了几点小iOS自身的使用小技巧分享给大家。
    发表于 12-19 13:42 536次阅读

    不知道的 Vivo X9玩机小技巧!磨砂黑版你会买吗?

    Vivo x9新配色,磨砂黑版现已在火热预订中,不知道购置x9的小伙伴对手机的体验怎么样?
    发表于 03-11 10:19 2983次阅读
    你<b class='flag-5'>不知道</b>的 Vivo X9玩机小技巧!磨砂黑版你会买吗?

    关于你可能不知道的printf

    你可能不知道的printf
    的头像 发表于 02-05 12:28 2342次阅读
    关于你可能<b class='flag-5'>不知道</b>的printf

    一些也许您还不知道的 TINA-TI 的那些资源!

    一些也许您还不知道的 TINA-TI 的那些资源!
    发表于 11-07 08:07 3次下载
    一些也许您还<b class='flag-5'>不知道</b>的 TINA-TI 的<b class='flag-5'>那些</b>资源!

    在Linux下你所不知道的df命令那些功能

    问题: 我知道在Linux上我可以用df命令来查看磁盘使用空间。你能告诉我df命令的实际例子使我可以最大限度得利用它吗?
    的头像 发表于 12-21 10:53 696次阅读

    不知道的FPC,它的发展史竟然是这样的!

    不知道的FPC,它的发展史竟然是这样的!
    的头像 发表于 11-15 10:48 435次阅读

    7种MOSFET栅极电路的常见作用,不看不知道

    7种MOSFET栅极电路的常见作用,不看不知道
    的头像 发表于 12-15 09:46 355次阅读
    7种MOSFET栅极电路的常见作用,不看<b class='flag-5'>不知道</b>!