Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2080790
  • 博文数量: 354
  • 博客积分: 4955
  • 博客等级: 上校
  • 技术积分: 4579
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-21 11:46
文章分类

全部博文(354)

文章存档

2015年(1)

2013年(4)

2012年(86)

2011年(115)

2010年(67)

2009年(81)

我的朋友

分类: LINUX

2011-11-14 16:12:59

如果文件a中包含文件b,则将文件b的记录打印出来输出到c文件里

文件a: 
10/05766798607,11/20050325191329,29/0.1,14/05766798607 
10/05767158557,11/20050325191329,29/0.08,14/05767158557 

文件b: 
05766798607 
05766798608 
05766798609 
通过文件a和文件b对比,导出这样的文件出来. 
10/05766798607,11/20050325191329,29/0.1,14/05766798607

 
 正确答案应该:
 方法一:  awk -F'[/,]' 'ARGIND==1{a[$0]}ARGIND>1{if ($2 in a)print $0}' b a >c
 方法二:  awk -F'[/,]' 'NR==FNR{a[$0]}NR>FNR{if ($2 in a) print $0}' b a >c
 
这两种方法是用数组处理的,速度比较快,处理9万行只需4秒。
 例二 awk数组处理两个文件索引的问题(替代法)
 [root@TestAs4 zlwt]# more a
deptA
deptB
deptC
deptD
[root@TestAs4 zlwt]# more b
aaa 0
bbb 1
ccc 2
ddd 0
eee 2
fff 2
[root@TestAs4 zlwt]# awk 'NR==FNR {k[i++]=$1} NR>FNR { print $1,k[$2]}' a b
aaa deptA
bbb deptB
ccc deptC
ddd deptA
eee deptC
fff deptC
 
NR==FNR {k[i++]=$1} #先把a文件的值赋给数组k,下标从0自动增长
 NR>FNR { print $1,k[$2] #其中 $1,$2是b中的第一,二个域,k[$2]为a的值
 
下面方法是r2007版主的其实是一样的
[root@TestAs4 zlwt]# awk '{if(NR==FNR)k[i++]=$0;else print $1,k[$2]}' a b
aaa deptA
bbb deptB
ccc deptC
ddd deptA
eee deptC
fff deptC
 
另外一个例子
 
awk ' BEGIN{FS="[|]";OFS="|"}
FNR==NR{a[$1]=$2}
FNR else {$1=a[$1];print}}
' wj wj1>wj2


文件1 
1|name1
2|name2
3|name3
5|name5
6|name6

文件2
1|name11
2|name22
3|name33
4|name44
5|name55
6|name66
7|name77
8|name88

输出结果
name1|name11
name2|name22
name3|name33
13|name44
name5|name55
name6|name66
13|name77
13|name88
 
 
它在处理2个以|分割的文件
例如
文件1 wj 格式
id1|desc1
文件2 wj1格式
id2|desc2

FNR==NR{a[$1]=$2} 意思是处理第一个文件时 把 desc1 赋值给 数组 a 的 a[id1] 单元。
FNR {if(!a[$1]) {$1="13";print}
else {$1=a[$1];print
如果a[$1] 是空,就把第2文件那行的第1列替换为 13 输出 如: 13|desc2
如果a[$1]非空,就是这个数组值已经在处理第1文件赋过值。就把$1替换为 a[$1] 即 文件1对应的$2。输出的就是 desc1|desc2

归纳一句 就是在文件2中以id2在文件1中查id1=id2的对应desc1 ,
找到输出 desc1|desc2
找不到输出 13|desc2
 
例:把数组中如1331131***** 批量替换成861331131*****

#cat a.txt

13994623***
13394660***
13394660***
13394671***
13394672***
13394690***
13394692***
15304863***

#awk '{print "86"$1}' a.txt > b.txt
 
8613994623***
8613394660***
8613394660***
8613394671***
8613394672***
8613394690***
8613394692***
8615304863***

#awk '{print substr($1,3,11)}' b.txt    把86去掉
13994623***
13394660***
13394660***
13394671***
13394672***
13394690***
13394692***
15304863***
 
 
------------------------------------------------------------------------------
                两个文件关联处理
[root@TestAs4 cwm]# awk '{print $1}' 153mdn.txt |uniq -c         
      4 七台河
      5 伊春
     18 佳木斯
     13 双鸭山
     66 哈尔滨
      1 大兴安岭
     32 大庆
     20 牡丹江
     19 绥化
     16 鸡西
     15 鹤岗
     10 黑河
     19 齐齐哈尔
[root@TestAs4 cwm]# awk '{print $1,substr($1,1,7)}' hlj_jifei >hlj_temp
[root@TestAs4 mdn]# more hlj_temp
13009700055 1300970
13009700495 1300970
13009701075 1300970
13009701282 1300970


[root@TestAs4 mdn]# ls
2  3  awk_script  cwm  hlj_jifei  hlj_temp  newmdn_table.TXT  temp  test1
[root@TestAs4 mdn]# more  test1
1300019                 510             020     广州
1300101                 110             010     北京
1300103                 110             010     北京
1300104                 110             010     北京
1300106                 110             010     北京

[root@TestAs4 mdn]# awk  'NR==FNR{a[substr($1,1,7)]=$4}NR>FNR&&a[b=substr($1,1,7)]{print $1,a[b]}' test1 hlj_temp |more

[root@TestAs4 mdn]# awk  'NR==FNR{a[$1]=$4}NR>FNR&&a[b=substr($1,1,7)]{print $1,a[b]}' test1 hlj_temp
13009700055 哈尔滨
13009700495 哈尔滨
13009701075 哈尔滨
13009701282 哈尔滨

--------------------------------------------------------------------------------------
[root@TestAs4 mdn]# more temp 
1300970 13009700055
1300970 13009700495
1300970 13009701075
1300970 13009701282


--------------------------------------------------------------------------------

[root@TestAs4 mdn]# more awk_script
BEGIN { while ((getline < "test1") > 0){ lines[$1]=$4 };OFS=" " } 

   if($1 in lines){ 
       $1=lines[$1]    #把test1文件的$4替换到temp文件的$1上
        print $0
   }
}  
#要求把test1文件的第四个字段插入到temp文件的相应条目的第一个子段中
#利用getline获取test1文件的第四个字段,并且放到一个数组中。


[root@TestAs4 mdn]# ls
2  3  awk_script  cwm  hlj_jifei  hlj_temp  newmdn_table.TXT  temp  test1
[root@TestAs4 mdn]# awk -f awk_script  temp  |wc -l
63440
[root@TestAs4 mdn]# awk -f awk_script  temp  |more
哈尔滨 13009700055
哈尔滨 13009700495
阅读(864) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~