2011-09-20 3 views
-2

Je suis nouveau à AWK, j'ai quelques idées de base dans AWK. Je veux supprimer les doublons dans un fichier, par exemple:en utilisant AWK comment supprimer ce genre de doublons?

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. 

C'est un exemple de fichier, à partir qu'utiliser cette commande, je suis sortie comme ceci:

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

Mais je veux sortie comme ça

008.ASIA 
    anish.asia 

ou

008.ASIA 
ANISH.asia 

Comment puis-je supprimer ce genre de doublons?

Merci à l'avance Anish kumar.V

Merci pour votre reponse immédiate, En fait, j'écrit un script complet en bash, maintenant, je suis en phase finale. Comment appeler python dans ce :-(

#!/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] 

Dans ce

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

dans cette partie seulement maintenant que je suis à la recherche comment obtenir les valeurs distinctes si des suggestions en utilisant AWK est mieux pour moi. Merci encore une fois pour votre réponse immédiate.

+0

Désolé, mais ajoutez que tout votre script Bash posté ici ne clarifie pas vraiment les choses. Pouvez-vous réduire votre question à un petit exemple plus une déclaration du problème que vous rencontrez actuellement? –

+0

Salut maintenant Problème est mon premier poste, je viens de montrer ici que j'ai écrit un script ... est-il possible d'utiliser AWK lui-même et je n'ai pas beaucoup d'idée en python .. –

+0

Pouvez-vous nettoyer votre question? Cela aiderait beaucoup. –

Répondre

0

ne pas utiliser AWK. utilisez 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 

qui pourrait être e Asier à travailler avec AWK. Oui. C'est plus long. Mais cela peut être plus facile à comprendre.

+0

Merci pour votre réponse immédiate, En fait, j'ai écrit un script complet dans bash, maintenant iam dans la dernière étape .. comment invoquer python dans ce :-( –

+0

"comment invoquer python"? Quoi? C'est comme AWK: 'python yourscript En outre, cette question a déjà été posée, et cette question est trivialement traitée par l'intermédiaire de 'man python' à l'invite de commande, et cette question est traitée de manière triviale en lisant la documentation sur http://www.python.org/ –

1

En mettant votre script AWK dans un fichier séparé, vous pouvez dire ce qui se passe réellement. Voici une approche simple à votre problème « filtrer les doublons »:

# 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) 
    } 
} 

Vous pouvez exécuter des fichiers AWK en passant le -f option à awk.

Si le script ci-dessus n'est pas reconnaissable comme un script AWK, ici il est sous forme de ligne:

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

Veuillez regarder à nouveau ma question elle-même, à cause de la faible réputation i ma question elle-même edited ... –

+0

Est-ce ma AWK réponse utile? –

+0

Merci beaucoup l'homme mais pas adopter le uniq DATAA 0008.ASIA ns1.0008.asia www .0008.asia anish.asia ns2.anish.asia Mais je ne veux que les domaines principaux de sortie. 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 

BTW, il est intéressant, que je vous ai donné une solution à http://www.unix.com/shell-programming-scripting/167512-using-awk-how-its-possible.html, et vous ajoutez quelque chose de nouveau dans votre fichier, puis j'ai ajouté la fonction tolower() ici.: D

+0

+1 pour 'tolower()' –

+1

+1 pour 'Je vous ai donné une solution à ...' – shellter

1

Ou, il suffit d'utiliser le shell:

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 

produit

0008.ASIA 
anish.asia 
+0

Son exemple de sortie indique qu'il a supprimé des sous-domaines comme ns1, ns2. +1 pour Nice utilisation de bash 'alors que lire ... cas ...' pipline! – shellter

+0

En effet. Mis à jour pour exclure les domaines avec 2 (ou plus) points. –

0

Voici une solution de rechange. Laissez sort créer votre liste pliée tubé et uniq (et il sera trié!)

{ 
    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 

sortie

0008.ASIA 
anish.asia 

Edit: fixe sort -i -u-sort -f -u. Beaucoup d'autres utilitaires unix utilisent '-i' pour indiquer 'ignorecase'. Mon test m'a montré que j'avais besoin de le réparer, et j'ai oublié de corriger l'affichage final.

Questions connexes