awk数组

    技术2022-05-20  67

    如果文件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/bashwhile read line ; doawk -F'[/,]' '$2 == '$line' {print $0}' a >>c

    done < b;

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

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

    [root@TestAs4 zlwt]# more adeptAdeptBdeptCdeptD[root@TestAs4 zlwt]# more baaa 0bbb 1ccc 2ddd 0eee 2fff 2[root@TestAs4 zlwt]# awk 'NR==FNR {k[i++]=$1} NR>FNR { print $1,k[$2]}' a baaa deptAbbb deptBccc deptCddd deptAeee deptCfff deptC

    NR==FNR {k[i++]=$1} #先把a文件的值赋给数组k,下标从0自动增长

    NR>FNR { print $1,k[$2] #其中 $1,$2b中的第一,二个域,k[$2]a的值

    下面方法是r2007版主的其实是一样的

    [root@TestAs4 zlwt]# awk '{if(NR==FNR)k[i++]=$0;else print $1,k[$2]}' a baaa deptAbbb deptBccc deptCddd deptAeee deptCfff 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|name12|name23|name35|name56|name6文件21|name112|name223|name334|name445|name556|name667|name778|name88输出结果name1|name11name2|name22name3|name3313|name44name5|name55name6|name6613|name7713|name88

    它在处理2个以|分割的文件例如文件1 wj 格式id1|desc1文件2 wj1格式id2|desc2FNR==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_temp13009700055 130097013009700495 130097013009701075 130097013009701282 1300970[root@TestAs4 mdn]# ls2 3 awk_script cwm hlj_jifei hlj_temp newmdn_table.TXT temp test1[root@TestAs4 mdn]# more test11300019                 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_temp13009700055 哈尔滨13009700495 哈尔滨13009701075 哈尔滨13009701282 哈尔滨--------------------------------------------------------------------------------------[root@TestAs4 mdn]# more temp 1300970 130097000551300970 130097004951300970 130097010751300970 13009701282--------------------------------------------------------------------------------[root@TestAs4 mdn]# more awk_scriptBEGIN { 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]# ls2 3 awk_script cwm hlj_jifei hlj_temp newmdn_table.TXT temp test1[root@TestAs4 mdn]# awk -f awk_script temp |wc -l63440[root@TestAs4 mdn]# awk -f awk_script temp |more哈尔滨 13009700055哈尔滨 13009700495awk又一个例子: 统计某一列所有值的和把所有第二列的值求和[root@TestAs4 ~]# more cwm.txt cwm 123zbl 124yhh 2cj   1[root@TestAs4 ~]# awk '{a[x++]=$2};END{for(i=1; i<=NR; i++)   b=b+a[i-1];print b }' cwm.txt250[root@TestAs4 ~]# awk '{a[NR]=$2;b=0};END{for(i=1; i<=NR; i++) b=b+a[i];print b }' cwm.txt250显示文件的从第m行到n[root@TestAs4 ~]# sed -n '2,10'p   mdn.txt [root@TestAs4 ~]# awk 'NR==2,NR==10{print $0}' mdn.txt 给手机号码分GC1.C(C网是133153开头的号)awk '$1 ~/^133/ || $1 ~/^153/'   file.txt >C.txt2.G(由于G网比较多非133153开头的都是)awk '$1 !~/^133/ && $1 !~/^153/' file.txt >G.txt给两个文件每行对应连接[root@TestAs4 cwm]# more tep_01.txt cwm    13911320988zbl    13931095233chen   12333333333cwm    12233333333cwm    45555555555[root@TestAs4 cwm]# more tep_02.txt cwm1    111320988zbl1    131095233chen1   133333333cwm1    133333333cwm1    455555555awk 'NR==FNR {a[FNR]=$0} NR>FNR { print $0,a[FNR]}' tep_01.txt tep_02.txt   cwm1    111320988 cwm    13911320988zbl1    131095233 zbl    13931095233chen1   133333333 chen   12333333333cwm1    133333333 cwm    12233333333cwm1    455555555 cwm    45555555555还有一个命令 paste[root@TestAs4 cwm]# paste tep_01.txt tep_02.txt cwm    13911320988      cwm1    111320988zbl    13931095233      zbl1    131095233chen   12333333333      chen1   133333333cwm    12233333333      cwm1    133333333cwm    45555555555      cwm1    455555555awk 处理HAN开头下一个HAN的上一行数字为结尾的文件 ... 或者中提取任一文件段 以HAN开头,下一个HAN的上一行数字段为结尾的一段 生成HAN1等这样的文件 [root@TestAs4 cwm]# more file1.txt HAN 112 23 34 4523 45 56HAN 212 23 34 4523 45 5612 23 34 45HAN 312 23 34 4523 45 56 4412 23 34 4523 45 56HAN 412 23 34 4523 45 56HAN nawk '{ 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.txt1300018 1300019北京6.txt130010013001011300126130012713001281300129   天津4.txt1300130130013113001321300133awk '{a[$2]++;print $1 > $2} END {for (i in a) {print "mv " i " " i""a[i]".txt" }}' ufile|sh

     


    最新回复(0)