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

    技术2022-05-11  17

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

    最新回复(0)