使用shell在文本文件中查找重复条目

时间:2016-08-10 22:22:30

标签: linux shell awk

我试图在文本文件(test.log)中找到重复的* .sh条目,并使用shell程序将其删除。由于路径不同所以uniq -u总是打印重复条目,即使文本文件中有两个first_prog.sh条目

cat test.log       
/mnt/abc/shellprog/test/first_prog.sh        
/mnt/abc/shellprog/test/second_prog.sh    
/mnt/abc/my_shellprog/test/first_prog.sh           
/mnt/abc/my_shellprog/test/third_prog.sh    

输出:

/mnt/abc/shellprog/test/first_prog.sh    
/mnt/abc/shellprog/test/second_prog.sh    
/mnt/abc/my_shellprog/test/third_prog.sh    

我尝试了几个使用少量命令的方法,但对如何获得高于输出的想法并不知道。

rev test.log | cut -f1 -d/ | rev | sort | uniq -d     

有什么线索吗?

3 个答案:

答案 0 :(得分:3)

您可以通过在/上拆分字段并在关联数组中使用$NF(最后一个字段)来使用awk:

awk -F/ '!seen[$NF]++' test.log

/mnt/abc/shellprog/test/first_prog.sh
/mnt/abc/shellprog/test/second_prog.sh
/mnt/abc/my_shellprog/test/third_prog.sh

答案 1 :(得分:0)

awk为这些任务提供了亮点,但这里的解决方案是非awk,

$ sed 's|.*/|& |' file | sort -k2 -u | sed 's|/ |/|'

/mnt/abc/shellprog/test/first_prog.sh
/mnt/abc/shellprog/test/second_prog.sh
/mnt/abc/my_shellprog/test/third_prog.sh

或者,如果您的路径是平衡的(所有文件的父项数相同)

$ sort -t/ -k5 -u file

/mnt/abc/shellprog/test/first_prog.sh
/mnt/abc/shellprog/test/second_prog.sh
/mnt/abc/my_shellprog/test/third_prog.sh

答案 2 :(得分:0)

 awk '!/my_shellprog\/test\/first/' file
/mnt/abc/shellprog/test/first_prog.sh        
/mnt/abc/shellprog/test/second_prog.sh    
/mnt/abc/my_shellprog/test/third_prog.sh