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

假设有文本例如以下

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. 解决ssh登录Host key verification failed

    使用SSH登录某台机器,有时因为server端的一些变动,会出现以下信息: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @    WARNING: R ...

  2. jquery api 常见api 效果操作例子

    addClass_removeClass_toggleClass_hasClass.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 ...

  3. Android虚拟键盘弹出时挡住EditText解决方法

    在manifest的activity节点使用 Xml代码   <activity android:windowSoftInputMode="adjustResize"/> ...

  4. android:hint属性对TextView的影响

    近期看到同事写的一段代码,非常easy吧就是: <LinearLayout android:layout_width="wrap_content" android:layou ...

  5. Spatial Transformer Network

    https://blog.csdn.net/yaoqi_isee/article/details/72784881 Abstract: 作者说明了CNN对于输入的数据缺乏空间变换不变形(lack of ...

  6. sql server数据库查询超时报错

    报错信息如下: 链接服务器"DBJointFrame"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "查询超时已过期". ...

  7. node.js 操作excel 表格与XML文件常用的npm

    在日常工作中会经常用到把一些excel表格文件转化为json,xml,js等格式的文件,下面就是我在日常中用到的这些npm. 1.node-xlsx: node-xlsx可以把excel文件转化为上面 ...

  8. zeroclipboard解决跨域问题

    ZeroClipboard.setDefaults({ moviePath: "//d2glos6gx2bw40.cloudfront.net/C8QpR9/images/flash/Zer ...

  9. Sql 常用的语句实例与代码

    在学习SQL的时候,本来预计花三天的时候掌握MS SQL这些基础,现在争取提前一天看完.总结沉底下来,其实也没有多少东西: 1.程序初始化前,先连接数据库 MFC程序中添加记录的代码: [cpp] v ...

  10. [svc]salt基本原理

    转载自:来自:http://tech.mainwise.cn/?p=438 说明:salt是一个异构平台基础设置管理工具(虽然我们通常只用在Linux上),使用轻量级的通讯器ZMQ,用Python写成 ...