shell命令技巧——文本去重并保持原有顺序
简单来说,这个技巧相应的是例如以下一种场景
假设有文本例如以下
cccc
aaaa
bbbb
dddd
bbbb
cccc
aaaa
如今须要对它进行去重处理。这个非常easy,sort -u就能够搞定,可是假设我希望保持文本原有的顺序。比方这里有两个aaaa
,我仅仅是希望去掉第二个aaaa
,而第一个aaaa
在bbbb
的前面。去重后仍旧要在它前面。所以我期望的输出结果是
cccc
aaaa
bbbb
dddd
当然,这个问题本身并不难。用C++或python写起来都非常easy,但所谓杀机焉用牛刀,能用shell命令解决时。它永远都是我们的首选。答案在最后给出。以下说说我是怎样想到这样
我们有时候想把自己的文件夹增加环境变量PATH时会在~/.bashrc文件里这样写,比方待增加的文件夹为$HOME/bin
export PATH=$HOME/bin:$PATH
这样我们等于是在PATH追加了路径$HOME/bin并让它在最前面被搜索到。但当我们运行source ~/.bashrc
后,$HOME/bin文件夹就会被增加PATH,假设我们下次再增加一个文件夹,比方
export PATH=$HOME/local/bin:$HOME/bin:$PATH
再运行source ~/.bashrc
时,$HOME/bin文件夹在PATH中事实上会有两份记录。尽管这不影响使用。但对于一个强迫症来说,这是无法忍受的。于是问题就变成了,我们须要去掉$PATH里反复的路径,而且保持原有路径顺序不变,也就是原本谁在前面。去重后仍旧在前面,由于在运行shell命令时是从第一个路径開始查找的。所以顺序非常重要
好了。说了这么多我们来揭示终于的结果。以文章開始的数据为例,假设输入文件是in.txt。命令例如以下
cat -n in.txt | sort -k2,2 -k1,1n | uniq -f1 | sort -k1,1n | cut -f2-
这些都是非常easy的shell命令,以下稍作解释
cat -n in.txt : 输出文本,并在前面加上行号。以\t分隔
sort -k2,2 -k1,1n : 对输入内容排序,primary key是第二个字段,second key是第一个字段而且按数字大小排序
uniq -f1 : 忽略第一列。对文本进行去重,但输出时会包括第一列
sort -k1,1n : 对输入内容排序,key是第一个字段并按数字大小排序
cut -f2- : 输出第2列及之后的内容。默认分隔符为\t
大家能够从第一条命令開始,并依次组合。看看实际输出效果,那样便更easy理解了。对于$PATH中的反复路径又该怎样处理呢。还是曾经面的样例来说,仅仅需在前后用tr做一下转换就可以
export PATH=$HOME/local/bin:$HOME/bin:$PATH
export PATH=`echo $PATH | tr ':' '\n' | cat -n | sort -k2,2 -k1,1n | uniq -f1 | sort -k1,1n | cut -f2- | tr '\n' ':'`
事实上这样使用PATH会有个问题,比方我们运行了以上命令后。假设想去掉$HOME/bin这个路径。仅仅改动为例如以下内容是不够的
export PATH=$HOME/local/bin:$PATH
export PATH=`echo $PATH | tr ':' '\n' | cat -n | sort -k2,2 -k1,1n | uniq -f1 | sort -k1,1n | cut -f2- | tr '\n' ':'`
由于我们已经将$HOME/bin增加了$PATH中,这样做并没有起到删除的作用,或许最好的方式还是自己清楚的知道全部路径,然后显示指定,而不是採取追加的方式
转载于:https://www.cnblogs.com/wzzkaifa/p/7297464.html
shell命令技巧——文本去重并保持原有顺序相关推荐
- 日志处理中一些shell命令技巧
日志处理中一些shell命令技巧 阴差阳错的做的日志分析,前途未卜的这段日子,唯一还有点意思的可能就是手动的处理大量日志.总结一下. 日志文件的输入是动则几个G的文本.从N个这样的文件中得到一个列表, ...
- shell命令的文本计算
今天在linux上碰到一个对比文件数据的问题,要用原始数据测试出算法所算出的数据是否正确,这要对原始数据进行操作和计算,下面我们用shell命令来解决这个问题.这里权限是root,是因为是在本人自己电 ...
- vim 执行shell命令技巧
:!cmd不退出vim 执行命令 cmd :r !cmd不退出vim执行命令cmd,并将cmd的输出内容插入当前文本中. :shell切换到shell里(此时并没有退出vim,可以理解成vim转入后台 ...
- linux写文本命令,一天一个shell命令 linux文本操作系列-chmod命令用法
先来熟悉下权限,以上一个例子comm下的文档为例 $ls -l -rw-rw-r-- 1 yjplxq yjplxq 36 7月 30 22:40 A.txt -rw-rw-r-- 1 yjpl ...
- 【一天一个shell命令】文本操作系列-touch
之前我们学过dd创建测试文件,如果不需要考虑文件大小,创建一个空白文件的话,不妨试试 touch: 将每个文件的访问时间和修改时间改为当前时间. 不存在的文件将会被创建为空文件,除非使用-c 或-h ...
- linux touch 源码,一天一个shell命令 linux文本操作系列-touch命令用法
之前我们学过dd创建测试文件,如果不需要考虑文件大小,创建一个空白文件的话,不妨试试 touch: 将每个文件的访问时间和修改时间改为当前时间. 不存在的文件将会被创建为空文件,除非使用-c 或-h ...
- linux中touch命令如何使用,一天一个shell命令 linux文本操作系列-touch命令用法
之前我们学过dd创建测试文件,如果不需要考虑文件大小,创建一个空白文件的话,不妨试试 touch: 将每个文件的访问时间和修改时间改为当前时间. 不存在的文件将会被创建为空文件,除非使用-c 或-h ...
- linux文本去重分割,Linux命令去重统计排序
利用Linux命令进行文本按行去重并按重复次数排序 linux命令行提供了非常强大的文本处理功能,组合利用linux命令能实现好多强大的功能.本文这里举例说明如何利用Linux命令行进行文本按行去重并 ...
- Linux中shell命令的用法和技巧
使用Linux shell是我每天的基本工作,但我经常会忘记一些有用的shell命令和l技巧.当然,命令我能记住,但我不敢说能记得如何用它执行某个特定任务.于是,我开始在一个文本文件里记录这些用法,并 ...
- 几个常用的文本处理shell 命令:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk
内容目录: find 文件查找 grep 文本搜索 xargs 命令行参数转换 sort 排序 uniq 消除重复行 用tr进行转换 cut 按列切分文本 paste 按列拼接文本 wc 统计行和字符 ...
最新文章
- AI视频行为分析系统项目复盘——技术篇1:Ubuntu 18.04部署编译OpenCV+contrib、TensorFlow2.1、CUDA10.1+cuDNN7.6.5、tensorRT6.0.1等
- mini2440 之——LED简单控制(裸机) c与汇编
- 数据结构——基本概念
- 基于 Jenkins 快速搭建持续集成环境--转
- HDU 1253-大逃亡(裸-DBFS)
- jq取第一个子元素为select_【转】jquery如何获取第一个或最后一个子元素?
- java 父子级json组装不用递归_2020面试阿里Java研发岗题库总结,想虐面试官不能错过的面试宝典...
- 约翰诺曼超级计算机研究中心,第433章 拉泽尔松教授的决定_学霸的黑科技系统_晨星LL作品_du00...
- 朴素贝叶斯算法_朴素贝叶斯算法原理
- HTML5 classList 操作类名
- 移动跨平台框架开发之一:ios重用c++库
- 开源GIS(十八)——分辨率与比例尺
- 学计算机平面设计的基础知识,新手学习平面设计2要点_计算机平面设计
- 颈椎病的成因及治疗预防方法
- [shell] find 指令的使用 (如:找到大于10M的文件)
- 路演活动平台,怎么报名参加创业路演?
- 轨道运营管理专业自荐书_城市轨道交通运营管理专业职业规划(1)
- 小程序实现image标签的图片铺满整个屏幕,高度自适应
- 故障:不能连接到共享打印机
- lammps教程:薄膜渗透模拟(3)--不同孔隙率对过滤效果的影响
热门文章
- cwm recovery 6.0.2.3下载_造梦西游3星辰辅助下载-造梦西游3星辰修改器下载v3.7.0 免费版...
- CS224N笔记——深入GRU和LSTM
- JDK动态代理在RPC框架中的应用
- 国足输韩国,柯洁很生气,后果很严重……
- mysql5.7 主从
- 软件评測师真题考试分析-5
- [Objective-C]ARC中NSString *与CFStringRef的相互转换
- redhat linux6.5下修改网卡名称
- 微软正式提供免费杀毒软件下载 仅限7.5万份
- Ctrl + R 后,悲剧咯、、、、