2011-09-20 2 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이 즉시 reponse에 대한

덕분에, 사실 내가 bash는 완전한 스크립트를 썼다 사전 에

덕분에, 지금은 마지막 단계입니다. 방법 만 지금은 AWK 나를 위해 더 나은 사용하므로, 어떠한 제안을 고유 한 값을 얻는 방법을 검색하고이 부분에 그 :-(에 그

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

에서

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

을 파이썬을 호출합니다. 감사합니다 다시 즉각적인 응답을.

+0

죄송합니다. 여기에 게시 된 전체 Bash 스크립트를 추가하면 실제로 상황이 명확 해지지 않습니다. 질문을 작은 예제와 현재 직면 한 문제에 대한 설명으로 줄일 수 있습니까? –

+0

안녕하세요 지금 문제는 내 전나무 게시물 혼자, 난 그냥 여기에 내가 스크립트를 쓴 ... AWK 자체를 사용하여 모든 가능성과 나는 많은 생각이 파이썬 아니에요 .. –

+0

당신의 질문을 정리할 수 있습니까? 그것은 정말로 많은 도움이 될 것입니다. –

답변

0

AWK를 사용하지 마십시오. 사용 파이썬을

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에서 완전한 스크립트를 작성했습니다. 이제 최종 단계에 있습니다. 그 점에서 파이썬을 호출하는 방법은 :-( –

+0

"어떻게 파이썬을 호출합니까?"무엇입니까? 그것은 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) 
    } 
} 

당신은 awk-f option를 전달하여 AWK 파일을 실행할 수 있습니다 : 다음은 간단한 당신의 "중복을 걸러"문제에 대한 접근 방식입니다.

위의 스크립트는 AWK 스크립트로 인식 할 수없는 경우는, 여기가 인라인 형태 : BTW

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 하지만 출력은 메인 도메인 만 원합니다. only 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 for bash'의 좋은 사용법 ... case ...'pipline! – shellter

+0

실제로. 2 (또는 그 이상) 도트가있는 도메인을 제외하도록 업데이트되었습니다. –

0

를 생성하는 대안 솔루션입니다. sort이 맡았다-접어 UNIQ 목록을 만들어 보자 (그것은 정렬됩니다!)

0008.ASIA 
anish.asia 

편집

{ 
    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 

출력 : sort -f -usort -i -u을 고정. 다른 많은 유닉스 유틸리티는 'ignorecase'를 표시하기 위해 '-i'를 사용합니다. 테스트 결과 최종 수정본을 수정하는 것을 잊었습니다.

관련 문제