awk数组处理两个文件的例子 awk 多个文件分开处理
文件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
[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
更多阅读
C#变长数组二 c 数组长度 变量
首先声明,这不是我写的,只是我看对你有用才贴上来的1、什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素实现了IColle
C#的动态数组 c 动态数组的用法
在使用数组的过程中,有时候希望数组的长度和元素个数能随程序的运行不断改变,但改变一次就要重新开辟一个新的数组对象,这样将占用内存空间。为了解决这个问题,Microsoft.NET Framework 体统了一个ArrayList类,专门用于处理可按动态增减
c语言中求数组长度的问题 c语言求数组的长度
求数组长度的方法有两种 第一种是intarray[n];strlen(array);//这个方法可以求得字符串数组的长度char sizeof(array);sizeof(array);//可以求的数组的长度
关于 静态数组和new分配的动态数组的区别 new动态分配数组
(1)对静态数组名进行sizeof运算时,结果是整个数组占用空间的大小;因此可以用sizeof(数组名)/sizeof(*数组名)来获取数组的长度。int a[5];则sizeof(a)=20,sizeof(*a)=4.因为整个数组共占20字节,首个元素(int型)占4字节。int *a=newin
今日Linux--变量键盘读取、数组与宣告:read,array,declare
我们上面提到的变量设定功能,都是由指令列直接设定的,那么,可不可以让用户能够经由键盘输入? 什么意思呢?是否记得某些程序执行的过程当中,会等待使用者输入 "yes/no" 之类的讯息啊? 在 bash里面也有相对应的功能喔!此外,我们还可以宣告这个