zoukankan      html  css  js  c++  java
  • shell命令技巧——文本去重并保持原有顺序

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

    假设有文本例如以下

    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 : 输出文本,并在前面加上行号。以	分隔
    sort -k2,2 -k1,1n : 对输入内容排序,primary key是第二个字段,second key是第一个字段而且按数字大小排序
    uniq -f1 : 忽略第一列。对文本进行去重,但输出时会包括第一列
    sort -k1,1n : 对输入内容排序,key是第一个字段并按数字大小排序
    cut -f2- : 输出第2列及之后的内容。默认分隔符为	
    

    大家能够从第一条命令開始,并依次组合。看看实际输出效果,那样便更easy理解了。对于$PATH中的反复路径又该怎样处理呢。还是曾经面的样例来说,仅仅需在前后用tr做一下转换就可以

    export PATH=$HOME/local/bin:$HOME/bin:$PATH
    export PATH=`echo $PATH | tr ':' '
    ' | cat -n | sort -k2,2 -k1,1n | uniq -f1 | sort -k1,1n | cut -f2- | tr '
    ' ':'`
    

    事实上这样使用PATH会有个问题,比方我们运行了以上命令后。假设想去掉$HOME/bin这个路径。仅仅改动为例如以下内容是不够的

    export PATH=$HOME/local/bin:$PATH
    export PATH=`echo $PATH | tr ':' '
    ' | cat -n | sort -k2,2 -k1,1n | uniq -f1 | sort -k1,1n | cut -f2- | tr '
    ' ':'`
    

    由于我们已经将$HOME/bin增加了$PATH中,这样做并没有起到删除的作用,或许最好的方式还是自己清楚的知道全部路径,然后显示指定,而不是採取追加的方式

  • 相关阅读:
    SpringMVC参数校验
    SpringBoot2集成Activiti6
    spring boot与activiti集成实战 转
    使用国内阿里maven私服方法
    springboot2.04与activiti 6.0集成
    idea actiBPM插件生成png文件 (解决没有Diagrams或Designer选项问题)
    嵌入式Qt-4.8.6显示中文并且改变字体大小和应用自己制作的字体库
    基于Qt Assistant制作软件帮助文档
    推荐一本书,30天自制操作系统
    Qt5 UI信号、槽自动连接的控件重名大坑(UI生成的槽函数存在一个隐患,即控件重名。对很复杂的控件,不要在 designer 里做提升,而是等到程序启动后,再动态创建,可以避免很多问题)
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7297464.html
Copyright © 2011-2022 走看看