我是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
如何删除这些重复项?
先谢谢 Anish kumar.V
感谢您立即回应,实际上我在bash中写了一个完整的脚本,现在我处于最后阶段。如何调用python: - (
#!/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" 07anis@gmail.com
在那
awk '/^[^ ]+ASIA/ && !_[$1]++{print $1; tot++}END{print "Total",tot,"Domains"}' $MainPath/$today.asia > $RootPath/zonefile/$today.asia
仅在这一部分我现在正在搜索如何获得不同的值,因此任何使用AWK的建议对我来说都更好。再次感谢您的回复。
答案 0 :(得分: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
答案 1 :(得分: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
option传递给awk
来运行AWK文件。
如果上述脚本无法识别为AWK脚本,则此处采用内联形式:
awk '{ key = tolower($1); sub(/\.$/, "", key); if (!(key in found)) { found[key] = 1; print($1) } }'
答案 2 :(得分:1)
或者,只需使用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
产生
0008.ASIA
anish.asia
答案 3 :(得分: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更容易使用。是。它更长。但它可能更容易理解。
答案 4 :(得分: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 -u
修改为sort -f -u
。许多其他unix实用程序使用'-i'来表示'ignorecase'。我的测试显示我需要修复它,我忘了修复最后的帖子。