awk数组处理两个文件的例子 awk 多个文件分开处理

如果文件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秒。

还有一种方法是通过while 每次用read 命令从b中读一条记录与a中$2比较如果相等则输出到c中

root@TestAs4 zlwt]# more for3.sh

#!/bin/bash

while read line ; do

awk -F'[/,]' '$2 == '$line' {print $0}' a >>c

done < b;

这种方法很好理解,但速度非常慢,每次只读取一条记录,9万行需5个小时处理。

例二  awk数组处理两个文件索引的问题(替代法)

[root@TestAs4 zlwt]# more a

deptA

deptB

deptC

deptD
awk数组处理两个文件的例子 awk 多个文件分开处理

[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<NR{if(!a[$1]) {$1="13";print}

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<NR 条件是在处理第2文件成立。这样在处理第2 文件时

{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***** 批量替换成86 1331131*****

#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

awk又一个例子: 统计某一列所有值的和

把所有第二列的值求和

[root@TestAs4 ~]# more cwm.txt

cwm 123

zbl 124

yhh 2

cj 1

[root@TestAs4 ~]# awk '{a[x++]=$2};END{for(i=1; i<=NR; i++) b=b+a[i-1];print b }' cwm.txt

250

[root@TestAs4 ~]# awk '{a[NR]=$2;b=0};END{for(i=1; i<=NR; i++) b=b+a[i];print b }' cwm.txt

250

显示文件的从第m行到n行

[root@TestAs4 ~]# sed -n '2,10'p mdn.txt

[root@TestAs4 ~]# awk 'NR==2,NR==10{print $0}' mdn.txt

给手机号码分G网C网

1.C网(C网是133或153开头的号)

awk '$1 ~/^133/ || $1 ~/^153/' file.txt >C网.txt

2.G网(由于G网比较多非133非153开头的都是)

awk '$1 !~/^133/ && $1 !~/^153/' file.txt >G网.txt

给两个文件每行对应连接

[root@TestAs4 cwm]# more tep_01.txt

cwm 13911320988

zbl 13931095233

chen 12333333333

cwm 12233333333

cwm 45555555555

[root@TestAs4 cwm]# more tep_02.txt

cwm1 111320988

zbl1 131095233

chen1 133333333

cwm1 133333333

cwm1 455555555

awk 'NR==FNR {a[FNR]=$0} NR>FNR { print $0,a[FNR]}' tep_01.txt tep_02.txt

cwm1 111320988 cwm 13911320988

zbl1 131095233 zbl 13931095233

chen1 133333333 chen 12333333333

cwm1 133333333 cwm 12233333333

cwm1 455555555 cwm 45555555555

还有一个命令 paste

[root@TestAs4 cwm]# paste tep_01.txt tep_02.txt

cwm 13911320988 cwm1 111320988

zbl 13931095233 zbl1 131095233

chen 12333333333 chen1 133333333

cwm 12233333333 cwm1 133333333

cwm 45555555555 cwm1 455555555

awk 处理HAN开头下一个HAN的上一行数字为结尾的文件 ... 或者中提取任一文件段 以HAN开头,下一个HAN的上一行数字段为结尾的一段 生成HAN1等这样的文件

[root@TestAs4 cwm]# more file1.txt

HAN 1

12 23 34 45

23 45 56

HAN 2

12 23 34 45

23 45 56

12 23 34 45

HAN 3

12 23 34 45

23 45 56 44

12 23 34 45

23 45 56

HAN 4

12 23 34 45

23 45 56

HAN n

awk '{ if ($1=="HAN" && NF==2) fn=$2; print $0>>"HAN" fn;}' file1.txt

awk '{fn=$2; print $1 >>fn"hb"}' hbuse.txt 这是所有记录以$2归类。

-----------------------找出两文件相同及不同的值 ----------------------------------

awk 'NR==FNR{a[$0]++} NR>FNR&&!a[$0]' file1 file2 找出文件2中不同的值

awk 'NR==FNR{a[$0]++} NR>FNR&&a[$0]' file1 file2 找出两文件中相同的值



awk 'NR==FNR{a[$0]}NR>FNR{ if(!($1 in a)) print $0}' file1 file2 找出文件2中不同的值

awk 'NR==FNR{a[$0]}NR>FNR{ if($1 in a) print $0}' file1 file2 找出两文件中相同的值

------------------------awk按字段分类统计 ----------------------------------------

1300018 广东

1300019 广东

1300100 北京

1300101 北京

1300126 北京

1300127 北京

1300128 北京

1300129 北京

1300130 天津

1300131 天津

1300132 天津

1300133 天津

想得到三个文件:

广东2.txt

1300018

1300019

北京6.txt

1300100

1300101

1300126

1300127

1300128

1300129

天津4.txt

1300130

1300131

1300132

1300133

awk '{a[$2]++;print $1 > $2} END {for (i in a) {print "mv " i " " i""a[i]".txt" }}' ufile|sh

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sahusoft/archive/2009/08/05/4414237.aspx

  

爱华网本文地址 » http://www.aihuau.com/a/25101013/149544.html

更多阅读

C#变长数组二 c 数组长度 变量

首先声明,这不是我写的,只是我看对你有用才贴上来的1、什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素实现了IColle

C#的动态数组 c 动态数组的用法

在使用数组的过程中,有时候希望数组的长度和元素个数能随程序的运行不断改变,但改变一次就要重新开辟一个新的数组对象,这样将占用内存空间。为了解决这个问题,Microsoft.NET Framework 体统了一个ArrayList类,专门用于处理可按动态增减

今日Linux--变量键盘读取、数组与宣告:read,array,declare

我们上面提到的变量设定功能,都是由指令列直接设定的,那么,可不可以让用户能够经由键盘输入? 什么意思呢?是否记得某些程序执行的过程当中,会等待使用者输入 "yes/no" 之类的讯息啊? 在 bash里面也有相对应的功能喔!此外,我们还可以宣告这个

声明:《awk数组处理两个文件的例子 awk 多个文件分开处理》为网友爱在奔跑分享!如侵犯到您的合法权益请联系我们删除