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

假设有文本例如以下

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中,这样做并没有起到删除的作用,或许最好的方式还是自己清楚的知道全部路径,然后显示指定,而不是採取追加的方式

shell命令技巧——文本去重并保持原有顺序的更多相关文章

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

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

  2. Linux_CentOS常用命令和shell命令技巧

    Linux_CentOS常用命令 关机 init 重启 init 列出当前目录的下的文件 ls //列出当前目录下的文件 ll //列出当前目录下的文件信息 等同ls -l 命令 切换目录 cd 目录 ...

  3. shell 命令合并文本

    之前想把代码打印出来看来着,后来合并完之后放在word里发现有2000多页,然后放弃了~anyway,这个命令还是挺有用的. 比如我有文本a001.dat, a002.dat, a003.dat .. ...

  4. Shell命令之文本操作

    前言 在Linux中,文本处理操作是最常见的,应用非常广泛,如果能熟练掌握,可以大大提高开发效率. awk/sed/grep是文本操作领域的“三剑客”,学会了这3个命令就可以应对绝大多数文本处理场景. ...

  5. Linux的常用shell命令技巧集

    1.删除0字节文件 find -type f -size 0 -exec rm -rf {} ; 2.查看进程 按内存从大到小排列 ps -e -o "%C : %p : %z : %a&q ...

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

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

  7. 工作中常用的 Shell 命令及技巧

    调试 bash 脚本的技巧 加 -x 参数运行 bash 脚本时,会显示执行的语句 # 也可以在 demo.sh 中加上 set -x bash -x demo.sh 设置环境变量,然后通过如上方式运 ...

  8. Bash shell命令记录和CentOS的一些技巧

    ①CentOS的实用技巧: 一.按下ctrl+alt+F2可由图形界面切换至命令行(shell窗口),按下ctrl+alt+F1可由命令行切换至图形界面(前提是安装CentOS时软件选择项选择安装了图 ...

  9. Linux常用命令(第二版) --Shell应用技巧

    Shell应用技巧 小技巧: 1.命令补全功能: <Tab>键 2.清屏: Ctrl+l 3.删除光标前所有内容: Ctrl+u 4.命令历史记录: history 这时:  !histo ...

随机推荐

  1. 安装SQL SERVER 2016 CTP (二)[多图]

    内容中包含 base64string 图片造成字符过多,拒绝显示

  2. 娓娓道来c指针 (4)解析c的声明语句

    (4)解析c的声明语句 在继续探索c指针之前.有必要来解析下c语言中复杂的声明语法. 仅仅须要记住两则:一个原则,一个规则. 原则:先看标示符. 规则:运算符优先级是规则. 举例说明 1.最简单的 i ...

  3. OFBiz实战(1):整合Groovy+FreeMaker

    这是OFBiz实战系列的第一篇文件,该系列的目的是整合Groovy+FreeMaker开发一个图书管理系统,阐述在此过程中碰到的一系列问题,以及如何解决这些问题.第一篇文章说明如何使用Groovy+F ...

  4. 基于canvas的原生JS时钟效果

    概述 运用html5新增画布canvas技术,绘制时钟效果,无需引用任何插件,纯js. 详细 代码下载:http://www.demodashi.com/demo/11935.html 给大家介绍一个 ...

  5. 探秘蓝牙隐藏API

    上次讲解Android的蓝牙基本用法,这次讲得深入些,探讨下蓝牙方面的隐藏API.用过Android系统设置(Setting)的人都知道蓝牙搜索之后可以建立配对和解除配对,但是这两项功能的函数没有在S ...

  6. C#:将数据网格内的数据导出到Excel

    public void ExportDataToExecel(DataGridView dataGridView1) { SaveFileDialog kk = new SaveFileDialog( ...

  7. 连载:面向对象葵花宝典:思想、技巧与实践(35) - NOP原则

    NOP.No Overdesign Priciple.不要过度设计原则. 这应该是你第一次看到这个原则.而且你也不用上网查了,由于这个不是大师们创造的,而是我创造的:) 之所以提出这个原则,是我自己吃 ...

  8. 日期常用操作类DateUtil

    一.给定yyyy-MM-dd hh:mm:ss格式的字符串,返回Date. public Date convertStr2Date(String dateString) { try { SimpleD ...

  9. express 设置header解决跨域问题

    //设置跨域访问 app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", ...

  10. EasyUI combobox的panelHeight自动高度

    在使用EasyUI的时候,有时会用到combobox组件,这里的记录数不是很固定,设置为auto可能会被挡住,设置固定高度时,option很少时,也很丑 所以这里给出我自己自动调整combobox的p ...