6月 252012
 

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
[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***** 批量替换成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

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

 Posted by at 上午 3:24
5月 182012
 

  今天在新安装的Windows 7上安装Office2010,由于把临时目录放在内存盘上,直接运行安装会失败,所以我右键解压到一个目录后运行setup.exe进行安装,没想到出 现了“安装程序包的语言不受系统支持”的提示,上网查了一下发现是Office 2010正常的安装文件应该是有文件夹结构的,WinRAR程序不能正确将 CAB 自解压程序中的文件夹结构恢复出来,所以 setup.exe 找不到需要的安装文件。

  解决方法是按住SHIFT键,右键单击EXE安装包,在菜单中选择“复制为路径”,将完整文件名复制,粘贴到命令提示符或开始菜单运行框中,在其后面加上参数并跟文件夹路径,即可直接将其解压缩到指定的文件夹。

比如我要解压到E:\Office2010下是

“H:\office professional plus2010.exe” /extract:e:\office2010

解压完后去解压目录中运行setup.exe进行安装。

 Posted by at 下午 1:29
3月 072012
 

ScriptFileName=”SingleContourGen.gms”
ContourInterval=100
ContourElevtion=0
ContourElevtionHighest=1000

Set fso = CreateObject(“Scripting.FileSystemObject”)
Set MyFile = fso.CreateTextFile(ScriptFileName, True)
MyFile.WriteLine(“GLOBAL_MAPPER_SCRIPT VERSION=””1.00″””)
MyFile.WriteLine(“ENABLE_PROGRESS=YES”)

Do
MyFile.WriteBlankLines(2)
MyFile.WriteLine(“GENERATE_CONTOURS ELEV_UNITS=METERS SIMPLIFICATION=0 SINGLE_LEVEL_ONLY=YES \”)
MyFile.WriteLine(“INTERVAL=”&ContourElevtion)

MyFile.WriteBlankLines(1)

MyFile.WriteLine(“EXPORT_VECTOR GEN_WORLD_FILE=YES GEN_PRJ_FILE=YES \”)
MyFile.WriteLine(“FILENAME=Contour”&ConTourElevtion&”.shp TYPE=SHAPEFILE SHAPE_TYPE=LINES”)

MyFile.WriteBlankLines(1)

MyFile.WriteLine(“UNLOAD_LAYER FILENAME=”)

ContourElevtion=ContourElevtion+ContourInterval

Loop While ContourElevtion <= ContourElevtionHighest

MyFile.Close

 Posted by at 下午 2:17