awk數(shù)組處理兩個(gè)文件的例子
如果文件a中包含文件b,,則將文件b的記錄打印出來(lái)輸出到c文件里 文件a:
10/05766798607,11/20050325191329,29/0.1,14/05766798607 10/05767158557,11/20050325191329,29/0.08,14/05767158557 文件b:
05766798607 05766798608 05766798609 通過(guò)文件a和文件b對(duì)比,導(dǎo)出這樣的文件出來(lái). 10/05766798607,11/20050325191329,29/0.1,14/05766798607 本人查了很多網(wǎng)上的答案都是錯(cuò)誤碼的 正確答案應(yīng)該: 方法一: 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 這兩種方法是用數(shù)組處理的,速度比較快,,處理9萬(wàn)行只需4秒,。 還有一種方法是通過(guò)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萬(wàn)行需5個(gè)小時(shí)處理。 例二 awk數(shù)組處理兩個(gè)文件索引的問(wèn)題(替代法) [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(bǔ)文件的值賦給數(shù)組k,,下標(biāo)從0自動(dòng)增長(zhǎng) NR>FNR { print $1,k[$2] #其中 $1,$2是b中的第一,二個(gè)域,,k[$2]為a的值 下面方法是r2007版主的其實(shí)是一樣的 [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 另外一個(gè)例子 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 輸出結(jié)果
name1|name11 name2|name22 name3|name33 13|name44 name5|name55 name6|name66 13|name77 13|name88 它在處理2個(gè)以|分割的文件 例如 文件1 wj 格式 id1|desc1 文件2 wj1格式 id2|desc2 FNR==NR{a[$1]=$2} 意思是處理第一個(gè)文件時(shí) 把 desc1 賦值給 數(shù)組 a 的 a[id1] 單元。
FNR<NR 條件是在處理第2文件成立,。這樣在處理第2 文件時(shí) {if(!a[$1]) {$1="13";print} else {$1=a[$1];print 如果a[$1] 是空,,就把第2文件那行的第1列替換為 13 輸出 如: 13|desc2 如果a[$1]非空,就是這個(gè)數(shù)組值已經(jīng)在處理第1文件賦過(guò)值,。就把$1替換為 a[$1] 即 文件1對(duì)應(yīng)的$2,。輸出的就是 desc1|desc2 歸納一句 就是在文件2中以id2在文件1中查id1=id2的對(duì)應(yīng)desc1 ,
找到輸出 desc1|desc2 找不到輸出 13|desc2 例:把數(shù)組中如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*** ------------------------------------------------------------------------------ 兩個(gè)文件關(guān)聯(lián)處理 [root@TestAs4 cwm]# awk '{print $1}' 153mdn.txt |uniq -c 4 七臺(tái)河 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文件的第四個(gè)字段插入到temp文件的相應(yīng)條目的第一個(gè)子段中 #利用getline獲取test1文件的第四個(gè)字段,,并且放到一個(gè)數(shù)組中,。 [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又一個(gè)例子: 統(tǒng)計(jì)某一列所有值的和
把所有第二列的值求和
[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
給手機(jī)號(hào)碼分G網(wǎng)C網(wǎng) 1.C網(wǎng)(C網(wǎng)是133或153開頭的號(hào)) awk '$1 ~/^133/ || $1 ~/^153/' file.txt >C網(wǎng).txt
2.G網(wǎng)(由于G網(wǎng)比較多非133非153開頭的都是)
awk '$1 !~/^133/ && $1 !~/^153/' file.txt >G網(wǎng).txt
給兩個(gè)文件每行對(duì)應(yīng)連接
[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 還有一個(gè)命令 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開頭下一個(gè)HAN的上一行數(shù)字為結(jié)尾的文件 ... 或者中提取任一文件段 以HAN開頭,下一個(gè)HAN的上一行數(shù)字段為結(jié)尾的一段 生成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按字段分類統(tǒng)計(jì) ----------------------------------------
1300018 廣東 1300019 廣東 1300100 北京 1300101 北京 1300126 北京 1300127 北京 1300128 北京 1300129 北京 1300130 天津 1300131 天津 1300132 天津 1300133 天津 想得到三個(gè)文件:
廣東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
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/sahusoft/archive/2009/08/05/4414237.aspx
|
|