简单来说,这个技巧相应的是例如以下一种场景

假设有文本例如以下

cccc
aaaa
bbbb
dddd
bbbb
cccc
aaaa

如今须要对它进行去重处理。这个非常easy,sort -u就能够搞定,可是假设我希望保持文本原有的顺序。比方这里有两个aaaa,我仅仅是希望去掉第二个aaaa,而第一个aaaabbbb的前面。去重后仍旧要在它前面。所以我期望的输出结果是

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命令技巧——文本去重并保持原有顺序相关推荐

  1. 日志处理中一些shell命令技巧

    日志处理中一些shell命令技巧 阴差阳错的做的日志分析,前途未卜的这段日子,唯一还有点意思的可能就是手动的处理大量日志.总结一下. 日志文件的输入是动则几个G的文本.从N个这样的文件中得到一个列表, ...

  2. shell命令的文本计算

    今天在linux上碰到一个对比文件数据的问题,要用原始数据测试出算法所算出的数据是否正确,这要对原始数据进行操作和计算,下面我们用shell命令来解决这个问题.这里权限是root,是因为是在本人自己电 ...

  3. vim 执行shell命令技巧

    :!cmd不退出vim 执行命令 cmd :r !cmd不退出vim执行命令cmd,并将cmd的输出内容插入当前文本中. :shell切换到shell里(此时并没有退出vim,可以理解成vim转入后台 ...

  4. 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 ...

  5. 【一天一个shell命令】文本操作系列-touch

    之前我们学过dd创建测试文件,如果不需要考虑文件大小,创建一个空白文件的话,不妨试试 touch: 将每个文件的访问时间和修改时间改为当前时间. 不存在的文件将会被创建为空文件,除非使用-c 或-h ...

  6. linux touch 源码,一天一个shell命令 linux文本操作系列-touch命令用法

    之前我们学过dd创建测试文件,如果不需要考虑文件大小,创建一个空白文件的话,不妨试试 touch: 将每个文件的访问时间和修改时间改为当前时间. 不存在的文件将会被创建为空文件,除非使用-c 或-h ...

  7. linux中touch命令如何使用,一天一个shell命令 linux文本操作系列-touch命令用法

    之前我们学过dd创建测试文件,如果不需要考虑文件大小,创建一个空白文件的话,不妨试试 touch: 将每个文件的访问时间和修改时间改为当前时间. 不存在的文件将会被创建为空文件,除非使用-c 或-h ...

  8. linux文本去重分割,Linux命令去重统计排序

    利用Linux命令进行文本按行去重并按重复次数排序 linux命令行提供了非常强大的文本处理功能,组合利用linux命令能实现好多强大的功能.本文这里举例说明如何利用Linux命令行进行文本按行去重并 ...

  9. Linux中shell命令的用法和技巧

    使用Linux shell是我每天的基本工作,但我经常会忘记一些有用的shell命令和l技巧.当然,命令我能记住,但我不敢说能记得如何用它执行某个特定任务.于是,我开始在一个文本文件里记录这些用法,并 ...

  10. 几个常用的文本处理shell 命令:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk

    内容目录: find 文件查找 grep 文本搜索 xargs 命令行参数转换 sort 排序 uniq 消除重复行 用tr进行转换 cut 按列切分文本 paste 按列拼接文本 wc 统计行和字符 ...

最新文章

  1. AI视频行为分析系统项目复盘——技术篇1:Ubuntu 18.04部署编译OpenCV+contrib、TensorFlow2.1、CUDA10.1+cuDNN7.6.5、tensorRT6.0.1等
  2. mini2440 之——LED简单控制(裸机) c与汇编
  3. 数据结构——基本概念
  4. 基于 Jenkins 快速搭建持续集成环境--转
  5. HDU 1253-大逃亡(裸-DBFS)
  6. jq取第一个子元素为select_【转】jquery如何获取第一个或最后一个子元素?
  7. java 父子级json组装不用递归_2020面试阿里Java研发岗题库总结,想虐面试官不能错过的面试宝典...
  8. 约翰诺曼超级计算机研究中心,第433章 拉泽尔松教授的决定_学霸的黑科技系统_晨星LL作品_du00...
  9. 朴素贝叶斯算法_朴素贝叶斯算法原理
  10. HTML5 classList 操作类名
  11. 移动跨平台框架开发之一:ios重用c++库
  12. 开源GIS(十八)——分辨率与比例尺
  13. 学计算机平面设计的基础知识,新手学习平面设计2要点_计算机平面设计
  14. 颈椎病的成因及治疗预防方法
  15. [shell] find 指令的使用 (如:找到大于10M的文件)
  16. 路演活动平台,怎么报名参加创业路演?
  17. 轨道运营管理专业自荐书_城市轨道交通运营管理专业职业规划(1)
  18. 小程序实现image标签的图片铺满整个屏幕,高度自适应
  19. 故障:不能连接到共享打印机
  20. lammps教程:薄膜渗透模拟(3)--不同孔隙率对过滤效果的影响

热门文章

  1. cwm recovery 6.0.2.3下载_造梦西游3星辰辅助下载-造梦西游3星辰修改器下载v3.7.0 免费版...
  2. CS224N笔记——深入GRU和LSTM
  3. JDK动态代理在RPC框架中的应用
  4. 国足输韩国,柯洁很生气,后果很严重……
  5. mysql5.7 主从
  6. 软件评測师真题考试分析-5
  7. [Objective-C]ARC中NSString *与CFStringRef的相互转换
  8. redhat linux6.5下修改网卡名称
  9. 微软正式提供免费杀毒软件下载 仅限7.5万份
  10. Ctrl + R 后,悲剧咯、、、、