2016-08-10 81 views
0

我正在嘗試使用shell程序在文本文件(test.log)中查找重複的* .sh條目並將其刪除。由於路徑是不同的,因此uniq的-u總是打印重複條目,即使是在一個文本文件中的兩個first_prog.sh進入使用shell在文本文件中查找重複條目

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  

對此有何線索?

回答

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 
+0

感謝卡拉克法,這很有趣,發現很難使用sed,但看起來我們仍然可以在sed中完成這項工作。 – sinha

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

好吧..didnt看着awk,但看起來更容易使用sed。 感謝Anubhava,這將引燃我對作爲初學者的awk的更多瞭解。 – sinha

+0

是的,我沒有任何訂購問題,所以沒問題。 – sinha

+0

是的,您沒有訂購問題,但是使用3個命令而不是簡單的命令並不容易。不要忘記unix路徑也可以有空格,它會破壞'sed |排序' – anubhava

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  
+0

第3級(my_shellprog)後路徑不固定。它可以有任何數量的'/',所以簡單的awk將無法工作。上述問題的解決方案將得到解決 – sinha