2011-09-20 36 views
-2

我是AWK的新手,我在AWK有一些基本的想法。我想在一个文件中删除重复项, 例如:使用AWK如何去除这些类型的重复?

0008.ASIA. NS AS2.DNS.ASIA.CN. 
    0008.ASIA. NS AS2.DNS.ASIA.CN. 
    ns1.0008.asia. NS AS2.DNS.ASIA.CN. 
    www.0008.asia. NS AS2.DNS.ASIA.CN. 
    anish.asia NS AS2.DNS.ASIA.CN. 
    ns2.anish.asia NS AS2.DNS.ASIA.CN 
    ANISH.asia. NS AS2.DNS.ASIA.CN. 

这是一个示例文件,从使用此命令我得到这样的输出:

awk 'BEGIN{IGNORECASE=1}/^[^ ]+asia/ { gsub(/\.$/,"",$1);split($1,a,".")} length(a)==2{b[$1]++;}END{for (x in b)print x}' 

0008.ASIA 。
anish.asia。
ANISH.asia

但是我要像这样输出

008.ASIA 
    anish.asia 

008.ASIA 
ANISH.asia 

如何删除这些重复样的?

由于提前 阿尼什kumar.V

感谢您的即时效应初探,其实我在bash写了一个完整的脚本,现在我在最后阶段。如何在这部分调用蟒蛇在:-(

#!/bin/bash 

current_date=`date +%d-%m-%Y_%H.%M.%S` 
today=`date +%d%m%Y` 
yesterday=`date -d 'yesterday' '+%d%m%Y'` 
RootPath=/var/domaincount/asia/ 
MainPath=$RootPath${today}asia 
LOG=/var/tmp/log/asia/asiacount$current_date.log 

mkdir -p $MainPath 
echo Intelliscan Process started for Asia TLD $current_date 

exec 6>&1 >> $LOG 

################################################################################################# 
## Using Wget Downloading the Zone files it will try only one time 
if ! wget --tries=1 --ftp-user=USERNAME --ftp-password=PASSWORD ftp://ftp.anish.com:21/zonefile/anish.zone.gz 
then 
    echo Download Not Success Domain count Failed With Error 
    exit 1 
fi 
###The downloaded file in Gunzip format from that we need to unzip and start the domain count process#### 
gunzip asia.zone.gz > $MainPath/$today.asia 

###### It will start the Count ##### 
awk '/^[^ ]+ASIA/ && !_[$1]++{print $1; tot++}END{print "Total",tot,"Domains"}' $MainPath/$today.asia > $RootPath/zonefile/$today.asia 
awk '/Total/ {print $2}' $RootPath/zonefile/$today.asia > $RootPath/$today.count 

a=$(< $RootPath/$today.count) 
b=$(< $RootPath/$yesterday.count) 
c=$(awk 'NR==FNR{a[$0];next} $0 in a{tot++}END{print tot}' $RootPath/zonefile/$today.asia $RootPath/zonefile/$yesterday.asia) 

echo "$current_date Count For Asia TlD $a" 
echo "$current_date Overall Count For Asia TlD $c" 
echo "$current_date New Registration Domain Counts $((c - a))" 
echo "$current_date Deleted Domain Counts $((c - b))" 

exec >&6 6>&- 
cat $LOG | mail -s "Asia Tld Count log" [email protected] 

在这种

awk '/^[^ ]+ASIA/ && !_[$1]++{print $1; tot++}END{print "Total",tot,"Domains"}' $MainPath/$today.asia > $RootPath/zonefile/$today.asia 

只是现在我正在寻找如何使用AWK对我更好地得到不同值,因此任何建议。谢谢再次感谢您立即作出反应。

+0

对不起,但添加你在这里发布的整个Bash脚本并没有让事情变得更加清晰。您能否将您的问题简化为一个小例子以及您目前面临的问题的陈述? –

+0

嗨现在问题是我的冷杉单独发布,我刚刚在这里显示我写了一个脚本...有没有可能使用AWK本身,我没有太多的想法在蟒蛇.. –

+0

你能清理你的问题?这真的会有很大的帮助。 –

回答

0

不要使用AWK。使用Python

import readlines 
result= set() 
for line in readlines: 
    words = lines.split() 
    if "asia" in words[0].lower(): 
     result.add(words[0].lower()) 
for name in result: 
    print name 

这可能是Ë与AWK一起工作。是。它更长。但它可能更容易理解。

+0

感谢您的直接响应,其实我在bash中写了一个完整的脚本,现在iam在最后阶段..如何调用python :-( –

+0

“如何调用python”?什么?它就像AWK:'python yourscript .py'。此外,这个问题已经被问到了,这个问题在命令提示符下通过'man python'得到了简单的回答,并且通过阅读http://www.python.org/ –

1

通过将您的AWK脚本放入单独的文件中,您可以知道真正发生了什么。这里有一个简单的方法,你的“过滤掉重复的”问题:

# For each line in the file 
{ 

    # Decide on a unique key (eg. case insensitive without trailing period) 
    unique_key = tolower($1) 
    sub(/\.$/, "", unique_key) 

    # If this line isn't a duplicate (it hasn't been found yet) 
    if (!(unique_key in already_found)) { 

    # Mark this unique key as found 
    already_found[unique_key] = "found" 

    # Print out the relevant data 
    print($1) 
    } 
} 

您可以通过将-f optionawk运行AWK文件。

如果上面的脚本无法识别为一个AWK脚本,这是内嵌形式:

awk '{ key = tolower($1); sub(/\.$/, "", key); if (!(key in found)) { found[key] = 1; print($1) } }' 
+0

请再看看我的问题本身,因为低信誉的我编辑我的问题本身... –

+0

是我AWK答案有帮助? –

+0

非常感谢的人,但它没有得到uniq的DataA的 0008.ASIA ns1.0008.asia WWW .0008.asia anish.asia ns2.anish.asia 但我想只输出主要域名。只有 0008.ASIA anish.asia –

3
kent$ cat a 
0008.ASIA. NS AS2.DNS.ASIA.CN. 
0008.ASIA. NS AS2.DNS.ASIA.CN. 
ns1.0008.asia. NS AS2.DNS.ASIA.CN. 
www.0008.asia. NS AS2.DNS.ASIA.CN. 
anish.asia NS AS2.DNS.ASIA.CN. 
ns2.anish.asia NS AS2.DNS.ASIA.CN 
ANISH.asia. NS AS2.DNS.ASIA.CN. 


kent$ awk -F' NS' '{ gsub(/\.$/,"",$1);split($1,a,".")} length(a)==2{b[tolower($1)]++;}END{for (x in b)print x}' a 
anish.asia 
0008.asia 

顺便说一句,这是有趣的,我给你一个解决方案在http://www.unix.com/shell-programming-scripting/167512-using-awk-how-its-possible.html,和你在文件中添加新的东西,然后在这里添加tolower()函数。:d

+0

+1 for'tolower()' –

+1

+1'我给你一个解决方案......' – shellter

1

或者,只使用壳:

echo ' 0008.ASIA. NS AS2.DNS.ASIA.CN. 
    0008.ASIA. NS AS2.DNS.ASIA.CN. 
    ns1.0008.asia. NS AS2.DNS.ASIA.CN. 
    www.0008.asia. NS AS2.DNS.ASIA.CN. 
    anish.asia NS AS2.DNS.ASIA.CN. 
    ns2.anish.asia NS AS2.DNS.ASIA.CN 
    ANISH.asia. NS AS2.DNS.ASIA.CN.' | 
while read domain rest; do 
    domain=${domain%.} 
    case "$domain" in 
     (*.*.*) : ;; 
     (*.[aA][sS][iI][aA]) echo "$domain" ;; 
    esac 
done | 
sort -fu 

产生

0008.ASIA 
anish.asia 
+0

他的样本输出表明他已经去掉了像ns1,ns2这样的子域。 +1对于好的使用bash'而读......情况......'管道! – shellter

+0

确实。已更新以排除具有2个(或更多)点的域。 –

0

下面是一个替代的解决方案。让sort创建套管折叠和uniq的列表(它将进行排序!)

{ 
    cat - <<EOS 
    0008.ASIA. NS AS2.DNS.ASIA.CN. 
    0008.ASIA. NS AS2.DNS.ASIA.CN. 
    ns1.0008.asia. NS AS2.DNS.ASIA.CN. 
    www.0008.asia. NS AS2.DNS.ASIA.CN. 
    anish.asia NS AS2.DNS.ASIA.CN. 
    ns2.anish.asia NS AS2.DNS.ASIA.CN 
    ANISH.asia. NS AS2.DNS.ASIA.CN. 

EOS 
} | awk '{ 
     #dbg print "$0=" $0 
     targ=$1 
     sub(/\.$/, "", targ) 
     n=split(targ,tmpArr,".") 
     #dbg print "n="n 
     if (n > 2) targ=tmpArr[n-1] "." tmpArr[n] 
     print targ 
    }' \ 
| sort -f -u 

输出

0008.ASIA 
anish.asia 

编辑:固定sort -i -usort -f -u。许多其他Unix工具使用'-i'来指示'ignorecase'。我的测试表明我需要修复它,并且我忘了修复最终发布。