简单来说,这个技巧对应的是如下一种场景 假设有文本如下 cccc aaaa bbbb DDDd bbbb cccc aaaa 现在需要对它进行去重处理,这个很简单,sort -u就可以搞定,
简单来说,这个技巧对应的是如下一种场景
假设有文本如下
cccc
aaaa
bbbb
DDDd
bbbb
cccc
aaaa
cccc
aaaa
bbbb
dddd
我们有时候想把自己的目录加入环境变量PATH时会在~/.bashrc文件中这样写,比如待加入的目录为$HOME/bin
export PATH=$HOME/bin:$PATH
export PATH=$HOME/local/bin:$HOME/bin:$PATH
好了,说了这么多我们来揭示最终的结果,以文章开始的数据为例,假设输入文件是in.txt,命令如下
cat -n in.txt | sort -k2,2 -k1,1n | uniq -f1 | sort -k1,1n | cut -f2-
cat -n in.txt : 输出文本,并在前面加上行号,以t分隔
sort -k2,2 -k1,1n : 对输入内容排序,primary key是第二个字段,second key是第一个字段并且按数字大小排序
uniq -f1 : 忽略第一列,对文本进行去重,但输出时会包含第一列
sort -k1,1n : 对输入内容排序,key是第一个字段并按数字大小排序
cut -f2- : 输出第2列及之后的内容,默认分隔符为t
大家可以从第一条命令开始,并依次组合,看看实际输出效果,那样便更容易理解了。对于$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' ':'`
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' ':'`
--结束END--
本文标题: Shell实现文本去重并操持原有顺序
本文链接: https://lsjlt.com/news/18407.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0