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

  • 相关阅读:
    作业day04
    python开发学习day03 (基本数据类型; 输入输出; 基本运算符)
    作业day03
    作业day02
    python开发学习day02 (编程语言; 解释器 ; 运行方式; IDE; 变量)
    BasePage基础页面的封装
    设定浏览器驱动
    webdriver(chrome无头浏览器)
    webdriervAPI(窗口截图)
    webdriervAPI(常用的js方法)
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7297464.html
Copyright © 2011-2022 走看看