2014-09-11 53 views
1

父域我有域的列表:Sed,awk,grep或其他東西。從列表中刪除子域(如果存在)

test.example.com 
example.com 
example.test.com 
test.test.com 
test.com 
test.example.example.org 
example.example.org 

我需要刪除所有子域名,如果父域存在。 輸出必須是這樣的:

example.com 
test.com 
example.example.org 

這是可能的嗎?

+1

怎麼樣'co.uk'域? – anubhava 2014-09-11 06:56:29

+1

嘗試給你的(失敗)測試表明你已經嘗試了一些,而不是要求「免費」代碼。 – NeronLeVelu 2014-09-11 06:57:25

+0

我會轉向python來做這樣的事情 – michaeltang 2014-09-11 07:02:34

回答

3

以下內容取決於rev這不是Posix標準,但很容易獲得。

rev file.txt | 
sort | 
awk 'NR!=1&&substr($0,0,length(p))==p{next}{p=$0".";print}' | 
rev 

man rev

反轉命令使用util-linux軟件包的一部分,可從ftp://ftp.kernel.org/pub/linux/utils/util-linux/

您可以awk實施逆向(它沒有以字符爲單位;這一個逐段):

awk -F. '{for (i=NF; i>1; --i) printf "%s.",$i;print $1}' 

使用的是,上述管路變長一點:

awk -F. '{for (i=NF; i>1; --i) printf "%s.",$i;print $1}' file.txt | 
sort | 
awk -F. 'NR!=1&&substr($0,0,length(p))==p{next} 
     {p=$0".";for (i=NF; i>1; --i) printf "%s.",$i;print $1}' 
0
sed -n 's/.*/²&³/;H 
${g 
:a 
    s/\²\([^³]*³\)\(.*\).²[^³]*\1/²\1\2/ 
    ta 
:b 
    s/.²[^³]*\.\([^³]*³\)\(.*\)²\1/\2²\1/;tb 
    s/[²³]//g;s/^\n// 
    p 
    }' YourFile 

負載在所有緩衝器中的文件與分隔符,不是改變爲發現另一線路端子的任何字符串。 finaly刪除分隔符和打印

0

帶有內存的解決方案:首先將數據加載到散列中,然後在轉換時將行忽略,如果它們在散列中。

運行腳本時,注意輸入文件作爲參數

USAGE: remove_subdomains.awk myfile1 myfile1 

通過兩次來這裏的腳本remove_subdomain.awk

# remove_subdomain.awk 
FNR == NR { 
    memory[toupper($0)] = 42 
    next 
} 

match($0, /^[^.]+\.(.+)$/, mdata) { 
    if (toupper(mdata[1]) in memory) 
     $0 = "" 
} 

$0