Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5376548
  • 博文数量: 1144
  • 博客积分: 11974
  • 博客等级: 上将
  • 技术积分: 12312
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-13 20:06
文章存档

2017年(2)

2016年(14)

2015年(10)

2014年(28)

2013年(23)

2012年(29)

2011年(53)

2010年(86)

2009年(83)

2008年(43)

2007年(153)

2006年(575)

2005年(45)

分类: LINUX

2006-07-12 10:17:20

文件处理:说明:要处理的文件为参数1,用$1表示;对比文件为all_accounts.dat ;待处理文件每一行的第6列和对比文件中所有的行比较,若没有匹配行则删除该行.筛选结果输出到新文件.
用循环处理,脚本如下(对于数据比较部分不知道能否在一条awk语句中实现)


CODE:[Copy to clipboard]#!/bin/sh
#diff_accounts
if (! [ -f $1 ]) || [ $# -ne 1 ];then
    echo "error,no input file or file not exsit!"
    echo "usage: ./diff_accounts your_data_file"
    exit 1
fi
echo "diff_accounts starting ..."
sed 's/|/ /g' $1 >tmp.data
while read A1 A2 A3 A4 A5 A6 A7
do
    ALL=$A1\|$A2\|$A3\|$A4\|$A5\|$A6\|$A7
    if grep ^$A6$ all_accounts.dat >/dev/null 2>&1
    then
        echo $ALL >> yes_$1
    else
        echo $ALL >> none_$1
    fi
done < tmp.data
echo "diff_accounts done"

all_accounts.dat

pay01
pay02
pay03
pay04
pay1
perfmon
pesudo
pki
ppp
qd
qdmanager
query
queryrpt
read
redo

待处理文件:
102|李某|192.168.211.26|192.168.1.115|23|pesudo|1
110|张某|192.168.11.71|192.168.1.5|23|root|1
113|五大|192.168.11.71|192.168.2.36|23|pay01|1
115|杨三|192.168.11.71|192.168.2.11|23|ppaayy0011|1
115|小二|192.168.11.72|192.168.2.11|23|perfmon|1
115|阿猪|192.168.11.71|192.168.2.11|23|sybase119|1
115|老二|192.168.11.71|192.168.2.197|23|ppp|1
115|江小|192.168.11.72|192.168.2.210|23|sybase|1
awk -F '|' 'NR==FNR{a[$1]++}
NR>FNR&&a[$6]' all_accounts.dat $1
新手导航?



awk 的确强大
awk -F '|' 'NR==FNR{a[$1]++};NR>FNR&&a[$6]' all_accounts.dat my.dat

当NR==FNR,也就是读第一个文件all_accounts.dat 时,动作给a[]赋值;NR>FNR&&a[$6] 此句是读第二个文件my.dat时,a[$6]为真,也就是$6在a[]中有定义;缺省动作{print $0}
不知解释正确否?

何实测如下代码在速度上没有明显改进,甚至相反。


CODE:[Copy to clipboard]awk -F '|' 'NR==FNR{a[$1]};NR>FNR&&$6 in a' all_accounts.dat my.dat
从逻辑上分析,这段代码的每次循环做的工作要少一些。我把my.dat加大了很多,速度上没发现明显改变。
也许这个用法在all_accounts.dat很大的时候速度上有明显改进。
希望楼主测一下

 

QUOTE:
原帖由 r2007 于 2006-7-11 10:54 发表
为何实测如下代码在速度上没有明显改进,甚至相反。


CODE:[Copy to clipboard]awk -F '|' 'NR==FNR{a[$1]};NR>FNR&&$6 in a' all_accounts.dat my.dat
从逻辑上分析,这段代码的每次循环做的工作要少一些。我把 ...
实际数据,all_accounts.dat 有500多行,my.dat有几千行
下面是结果:
./diff_accounts telnet_2006-6-30.csv
diff_accounts starting ...
diff_accounts done
# times
0m2.270s 0m0.070s
0m0.450s 0m0.290s

# awk -F '|' 'NR==FNR{a[$1]++};NR>FNR&&a[$6]' all_accounts.dat telnet_2006-6-30.csv > tttttt
# times
0m2.330s 0m0.070s
0m0.460s 0m0.290s

 

阅读(996) | 评论(0) | 转发(0) |
0

上一篇:abs案例3

下一篇:VIM的几个小技巧

给主人留下些什么吧!~~