@程序员,你真的会用 Unix 命令?
那些常用的 Unix 命令,你不知道的功能!
作者 | Vegard Stikbakke
译者 | 弯月
责编 | 屠敏
出品 | CSDN(ID:CSDNNews)
如何挑战百万年薪的人工智能!
https://edu.csdn.net/topic/ai30?utm_source=csdn_bw
以下为译文:
我逐渐意识到,Unix 的命令行工具可以解决一切与文字处理有关的问题。我来讲一个我遇到过的问题,以及怎样用 Unix 命令行工具解决的。
问题
我在做我的硕士论文研究。像许多统计学家一样,我需要进行许多模拟。首先我利用一些数字的种子(以保证可复现性)来模拟了一些数据,然后在这些数据上用一个算法来估算一些东西。每次运行模拟时我都会创建一些文件,大概像下面这样:
dataset-directory/0001_data.csv
dataset-directory/0001_A.csv
但有时候运行会失败。这并不是太严重,模拟失败了我只需要运行另一个模拟就好了。比如,0001 这个数据我成功地运行了算法 A。因此我想在 0001 数据上使用算法 B。但我真正需要的是跟踪哪些命令失败了。
在许多数据上运行算法 A 之后,我得到了一大堆文件,像这样:
dataset-directory/0001_data.csv
dataset-directory/0001_A.csv
dataset-directory/0002_data.csv
dataset-directory/0002_A.csv
dataset-directory/0003_data.csv
dataset-directory/0003_A.csv
dataset-directory/0004_data.csv
dataset-directory/0005_data.csv
dataset-directory/0005_A.csv
dataset-directory/0006_data.csv
dataset-directory/0006_A.csv
dataset-directory/0007_data.csv
dataset-directory/0007_A.csv
dataset-directory/0008_data.csv
dataset-directory/0009_data.csv
dataset-directory/0009_A.csv
...
dataset-directory/0499_A.csv
通过观察得知算法 A 在数据 0004 和 0008 上的结果不存在。那么,怎样才能列出所有 A 没有成功的数据呢?
我当然可以手工来做,但那样很容易出错,而且很麻烦。要是能写程序完成就最好了!
解决方案
简单地来说,那些没有成功的就是从0001到0500的数字中去掉那些成功了的数字。而得到数字列表的最好命令就是 seq:
$> seq 10
1
2
3
4
5
6
7
8
9
10
(如果只给出一个数字,那么默认序列从1开始。当然,seq 2 10也会按照你期待的那样工作。)
现在,如果我能获得成功运行的列表,就可以通过 seq 命令生成所有可能的数字,再交叉检查两个列表来获得想要的结果了!
许多命令行工具只完成一项工作。例如,cut 可以获得每行指定位置上的字符:
$> cat text
Lorem ipsum
dolor sit amet
$> cat text | cut -c 2-5
orem
olor
注意这里使用了所谓的“管道运算符” | 。我说过,许多工具只做一件事,而且把那件事做到最好。很方便的是这些工具可以组合使用。使用管道,左边命令的结果就会变成右边命令的输入。注意这些命令会将输入当做一系列行来处理,通常来说这非常方便。
我们可以把成功的文件名单列表利用管道输入至 grep 命令,该命令可以使用正则表达式来查找。由于所有文件都以同样长度的四个数字开始,我们可以利用正则表达式 \d\d\d\d 来匹配这四个连续的数字,然后将文件末尾的 A 算法加到正则表达式中。要获得文件列表,每行一个文件,只需执行 ls。(尽管直接调用 ls 时并不会显示成每行一个文件,但放在管道中时输出就会变成这样。)
$> ls dataset-directory | grep '\d\d\d\d_A.csv'
0009_A.csv
0001_A.csv
0002_A.csv
0005_A.csv
0007_A.csv
0003_A.csv
0006_A.csv
...
出于某些原因,在使用 grep 之后这里的顺序混乱了。我们可以使用 sort 命令来改正。而且由于我们只关心数字,可以使用 cut -c 1-4 来取出数字部分。
$> ls dataset-directory | grep '\d\d\d\d_A.csv' | sort | cut -c 1-4
0001
0002
0003
0005
0006
0007
0009
...
0499
这些数字跟 seq 命令的结果不太一样,因为它们前面补了零。我们可以使用一段 Python 脚本将它们转成整数。
# parse.py
import sysfor line in sys.stdin:i = int(line)print(i)
现在将结果用管道导入这个脚本就能得到我们需要的数字:
$> ls dataset-directory | grep '\d\d\d\d_A.csv' | cut -c 1-4 | python3 parse.py
1
2
3
5
6
7
9
...
499
接近目标了!现在需要找出怎样才能交叉检查这两个数字的列表。幸运的是,有个命令叫做comm,它能检查两个输入流中的公共字符。为了将上面这个命令的输出作为输入使用,我们可以将其求值后重定向,只需使用<(...)即可实现:
$> comm <(ls dataset-directory | grep '\d\d\d\d_A.csv' | cut -c 1-4 | python3 parse.py) <(seq 500)12345678910
...500
这个输出不是太好理解。阅读 comm 的手册(运行 man comm)可以发现,comm 会“产生三列的输出,分别是:只存在于 file1 的行,只存在于 file2 的行,以及存在于两个文件的行”。要去掉第一列(其实它是空的,因为没有任何数字只存在于文件列表中),可以在调用 comm 时加入参数-1。我们也不关心同时存在于两个输入中的数字,因此还要传递标志-3。
$> comm -1 -3 <(ls dataset-directory | grep '\d\d\d\d_A.csv' | cut -c 1-4 | python3 parse.py) <(seq 500)
4
8
...
500
搞定!
网友说
这个方法发布之后,在 Hacker News(https://news.ycombinator.com/item?id=19160659)上引发无数网友参与讨论:
评论 1:
Unix CLI 工具最有意思的地方在于有数百万种有效的方法来解决问题。我还想到了我自己的“更好”的解决方案,跟这里说过的大多数方法完全不同的方法。但这不是重点。
这篇文章的优点在于它遵循逐步解决问题的过程。我发现很多与我一起工作的程序员都在努力解决 CLI 问题,我觉得这有点令人惊讶。但我认为这完全取决于你如何看待这样的问题。
如果你从“我如何构建一个函数来操作这个原始数据?”或“哪种数据结构最能表达这些文件名之间的关系?”那么肯定会遇到困难。但是,如果你考虑“如何改变这些数据以消除无关的细节?”和“我有什么工具可以解决数据上的问题,如果有一些麻烦,我怎么能解决这些麻烦?”并且如果能接受采用逐步的方式,而不是构建和操纵整个抽象逻辑结构,那么你就可以有效地利用这些工具在几分钟之内解决这些问题,无需花费几小时。
评论 2:
这篇文章的问题是:“cut”命令后的参数并没有什么标准格式。
更糟糕的是,看似有标准格式,其实被许多其他格式破坏了。通常,这些格式取决于最初的作者,以及当时人们流行的想法。所以,有时候标志会“聚集”在一起,同时假设多字符的标志会使用两个横线作为开始。后来一些程序开始用一个横线来表示多字符的标志。还有许多其他的不一致。如果我学习了cut的基本范围语法,我能知道 imagemagick 的基本语法吗?
这些不一致在技术上并不冲突,因为每个只存在于特定的背景下。但是,如果看到那些不一致的东西被放在管道两侧,特别是当其中一个是非标准用法时,理智上真的很痛苦。 (或者,即使它只是你需要的一个命令,但是你使用了错误的标志语法。)这一切都增加了认知负荷。
哦,从 Bash 转到 Python 语言是一个巨大的风险。如果你每天使用 Python 编写脚本,那可能还问题不大。但对于读者来说,语言边界是巨大的。因为用户不仅需要处理运行时错误和格式错误,而且还需要处理语言错误。如果命令行跳出一个语法错误或异常,我相信大多数读者就不会再读下去了。
程序员转行学什么语言?
https://edu.csdn.net/topic/ai30?utm_source=csdn_bw
原文:http://vegardstikbakke.com/unix/
本文为 CSDN 翻译,如需转载,请注明来源出处。
【End】
热 文 推 荐
谁杀死了芯片?
PPT写得好的人,为什么都如此遭人痛恨?
王思聪也救不了熊猫直播了?
程序员撒狗粮!3 天开发自己的婚礼小程序!
300道Python面试题,备战春招!
☞ 5年Go语言经验薪资翻倍! 这份全球职业报告中, 区块链开发者薪资排第三, 前两名你绝对想不到!(含完整版下载资源)
☞ 女神节 | 那些奋斗在IT领域的“女神”们
☞ 没有一个人,能躲过程序员的诱惑!
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"
点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。
喜欢就点击“好看”吧!
@程序员,你真的会用 Unix 命令?相关推荐
- 想要成为真正优秀的程序员是不是真的很难?
很多人认为要想成为一名优秀的程序员,那就需要一天24小时每天不断地编程--睁开眼睛要编程,闭上眼睛睡觉的时候还要梦到编程--我认为这是一种矫枉过正的方法.沿着这条路走,只会让你精疲力尽,犹如夸父逐日一 ...
- 程序员必备的21个Linux命令
程序员必备的21个Linux命令 https://www.toutiao.com/i6952120831325520417/?tt_from=weixin&utm_campaign=clien ...
- 【职场】你做程序员,真的是因为热爱吗?
今天的这一期,我们不聊技术,我们来聊一聊我们做程序员的初心,以及如何才能高效的学习编程和技术~ 01 你的初心 前一阵子,圈子里的一位知名的博主从老东家离职了,离职的视频看了一遍,尤其是其中他的一句话 ...
- 程序员你真的理解final关键字吗?
文章目录 1.修饰类 2.修饰方法 3.修饰变量 4.final变量修饰变量(成员变量.局部变量) 4.1 final修饰成员变量: 4.2 final修饰局部变量: 5.final变量和普通变量的区 ...
- 世上最杰出程序员,B 语言、Unix 之父为玩游戏,写了个操作系统
作者 | 年素清 责编 | 伍杏玲 出品 | 程序人生(ID:coder_life) Unix之父--肯•汤普森(Ken Thompson)被称作"世界上最杰出的程序员",他自学编 ...
- java必须会的linux_java程序员必须要学会的linux命令总结(推荐)
1.查找文件 find / -name filename.txt 根据名称查找/目录下的filename.txt文件. find . -name "*.xml" 递归查找所有的xm ...
- 一有问题,就想依靠别人,这根本不能算程序员。真的是代码民工。
若想找老师,或者是想找人问,这本身就是不对的,程序员是最好的职业,前提是合格的程序员,现在很多人,一有问题,就想依靠别人,这根本不能算程序员.真的是代码民工.
- 程序员职业生涯真的很短吗?
点击蓝字 关注我们 程序员职业生涯真的很短吗?是吃青春饭吗?35+ 岁真的会被优化吗?--在某乎上一搜"程序员",全是这类回答. 对于程序员,年龄真的是最大的威胁吗?其实并不是! ...
- 漫谈程序员(十八)windows中的命令subst
漫谈程序员(十八)windows中的命令subst 用法格式 一.subst [盘符] [路径] 将指定的路径替代盘符,该路径将作为驱动器使用 二.subst /d 解除替代 三.不加任何参数键入 ...
- android仿秒拍源码,你所不知道的程序员 程序员其实真的很…【Bus Weekly】三十六期...
原标题:你所不知道的程序员 程序员其实真的很-[Bus Weekly]三十六期 快,点击蓝色"字体"关注这个公众号,一起涨姿势- 现如今,程序员在中国的科技 圈可以说已经达到了举足 ...
最新文章
- 21 window对象常见事件
- win10未开启没有运行无线服务器,win10系统提示共享无线自动配置服务没有自动运行的解决办法...
- 我常用的Markdown公式符号
- static关键字 void和void指针 函数指针
- 200个c语言程序(由简单到复杂),200个c语言程序(由简单到复杂)
- 转两篇关于国是的网文
- 网课题库收录API接口以及免费网课查询API接口
- matlab设计椭圆低通滤波器,基于MATLAB的椭圆数字低通滤波器设计.doc
- word里双横线怎么打_word怎么加双下划线
- 中国出口印度尼西亚主要商品
- Android虚拟机使用摄像头(命令行)
- HTML中获取计算机用户名,VC++ 得到计算机名和用户名 GetComputerName GetUserName
- 验证邮箱地址和手机号码
- Pyinstaller打包eel和pygame需要注意的坑
- 读jquery 权威指南[2]-事件
- GD32F4(3): 在keil软件中使用GD-LINK下载调试
- 前端工程化实战 - 开发脚手架
- 作为成员的结构体(作为结构体的成员的结构体)
- 银联电子支付ChinaPay支付回调验证问题
- 学Python划重点 四 (图形界面wxPython 库的使用)
热门文章
- python里order什么意思_python中OrderedDict的使用方法详解
- 您的设备不支持googleplay服务_google play下载-google play下载安卓
- 记录——《C Primer Plus (第五版)》第九章编程练习第一题
- 数字轮廓投影仪行业调研报告 - 市场现状分析与发展前景预测
- 中国连续纤维毡行业市场供需与战略研究报告
- 抗菌药物敏感性检测仪行业调研报告 - 市场现状分析与发展前景预测
- html点导航栏换图片,jQuery点击导航栏选中更换样式的实现代码
- 第7章 贪吃蛇(《C和C++游戏趣味编程》配套教学视频)
- 前端通用国际化解决方案 di18n-translate
- oem718d 基准站设置_千寻cors账号参数设置完成,RTK手簿显示浮动或单点伪距,能不能进行测量?...