2014-02-18 45 views
0

比方說,我有一個文件,下面的文字:刪除重複項從文件子後綴的基礎上

foo.bar.baz 
bar.baz 
123.foo.bar.baz 
pqr.abc.def 
xyz.abc.def 
abc.def.ghi.jkl 
def.ghi.jkl 

我怎麼會從文件中刪除重複項,後綴的基礎上?沒有重複的預期輸出將是:

bar.baz 
pqr.abc.def 
xyz.abc.def 
def.ghi.jkl 

(考慮foo.bar.bazbar.baz後者是一個子後綴所以只有bar.baz保持然而,無論的pqr.abc.defxyz.abc.def沒有子串彼此的後綴,所以都保持。 。)

+4

你能更精確嗎?我在這裏沒有得到這種模式。 – dstronczak

+0

@dstronczak,我試着把它解釋得更好一些,也許現在這會有意義。 – user2064000

回答

2

試試這個:

#!/bin/bash 

INPUT_FILE="$1" 

in="$(cat $INPUT_FILE)" 
out="$in" 

for line in $in; do 
    out=$(echo "$out" | grep -v "\.$line\$") 
done 

echo "$out" 

你需要將它保存爲一個腳本(如bashor.sh),使其可執行(chmod +x bashor.sh),並與輸入文件作爲第一個參數調用它:

./bashor.sh path/to/input.txt 
+0

不錯的一個! :) ..... – hek2mgl

+0

我想出了一個類似的解決方案。你有一個錯誤:grep會將'.'解釋爲任何字符,所以你必須將其轉義:無論是'.'還是'$ line'中的點(即假設沒有其他特殊字符,並且前綴總是用點分隔) –

+0

實際上,如果只有三個字符的標記(我故意使用'.' aa通配符),我的解決方案會很好。但當然這是一個瘋狂的假設,所以我在問題中逃避了'。'...... –

0

使用sed逃脫正則表達式的字符串,前綴.,後綴$和管到這一點GNU的grep(-f -不與BSD工作grep,例如。在Mac上)。

sed 's/[^-A-Za-z0-9_]/\\&/g; s/^/./; s/$/$/' test.txt |grep -vf - test.txt 

我只是用來regular expression escaping from another answer並沒有去想它是否合理。初看起來似乎很好,但是逃脫得太多了,儘管這可能不是問題。