乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      awk數(shù)組處理兩個(gè)文件的例子

       小雁飛過 2010-12-29
      awk數(shù)組處理兩個(gè)文件的例子
      如果文件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對(duì)比,導(dǎo)出這樣的文件出來.
      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萬行只需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個(gè)小時(shí)處理。
      例二  awk數(shù)組處理兩個(gè)文件索引的問題(替代法)
      [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)增長
      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文件賦過值。就把$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
      本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/sahusoft/archive/2009/08/05/4414237.aspx

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多