<meter id="k3l7y"><menuitem id="k3l7y"></menuitem></meter>
    <td id="k3l7y"><menuitem id="k3l7y"></menuitem></td>
          <td id="k3l7y"></td>
          it运维开发教程,运维管理,因为微不足道,所以值得关注!域名来源:sos 救援 idc 数据?#34892;?所以sos+idc=sosidc.com

          awk 多文件操作教程

          发布:admin2017-9-29 10:19分类: awk 完全教程

          我们经常会将2个有关联文本文件进行合并处理。分别从不同文件获取需要的列,然后,整体输出到一起。awk进行多文件处理时候,常常会遇到2个方面问题,第一个是怎么样合并多个文件为一个文件。第二个问题就是怎么样将多行合并为一行显示。我这里说下我的处理2种方法,还有实现思路。

           

          ?#36947;?#25991;本:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          [[email protected] shell]$ awk 'FNR==1{print "\r\n"FILENAME}{print $0}' a.txt b.txt           
           
          a.txt
          100     wang    man
          200 wangsan woman
          300 wangming man
          400 wangzheng man
           
          b.txt
          100 90 80
          200 80 70
          300 60 50
          400 70 20

           

          需要合并得到结果:

          100     wang    man 90  80
          200 wangsan woman 80    70
          300 wangming man 60     50
          400 wangzheng man 70    20

           

           

          • awk多文件操作方法一:

          实现思路:

          通过外部命令合并文件,然后通过排序,然后通过awk进行合并操作。

          首先:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          [[email protected] shell]$ cat a.txt b.txt | sort -n -k1 |awk '{print}'
          100 90 80
          100     wang    man
          200 80 70
          200 wangsan woman
          300 60 50
          300 wangming man
          400 70 20
          400 wangzheng man

          现在需要把:第一列相同的处理合并到一行,这里需要用“next”语句。它操作,可以参考awk 多行合并【next 使用介绍】(常见应用4)

          继续:

          1
          2
          3
          4
          5
          [[email protected] shell]$  cat a.txt b.txt | sort -n -k1 |awk  'NR%2==1{fd1=$2"\t"$3;next}{print $0"\t"fd1}'    
          100     wang    man     90      80
          200 wangsan woman       80      70
          300 wangming man        60      50
          400 wangzheng man       70      20

           

          需要把几行合并,经常用到方法是:NR%num 然后将行值保存下来,next该行。在输出时候打印出来。

           

          • awk多文件操作方法二

          实现思路

          不借助第3放工具打开,直接通过awk 打开多个文件。然后可以通过:FILENAME获得当前处理文件名。NR总记录 FNR当前文件记录,以及ARGC传入?#38382;?#24635;数,ARGV是数组,各个?#38382;?#20540;。

          看下这些?#36947;?

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          [[email protected] shell]$ awk 'BEGIN{print ARGC,ARGV[0],ARGV[1],ARGV[2]}{print FILENAME,NR,FNR,$0}' a.txt b.txt                      
          3 awk a.txt b.txt
          a.txt 1 1 100   wang    man
          a.txt 2 2 200 wangsan woman
          a.txt 3 3 300 wangming man
          a.txt 4 4 400 wangzheng man
          b.txt 5 1 100 90 80
          b.txt 6 2 200 80 70
          b.txt 7 3 300 60 50
          b.txt 8 4 400 70 20

          程序代码:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          [[email protected] shell]$ awk '
          BEGIN{
          if(ARGC<3)
          {
            exit 1;
          }
           
          file="";
          }
          {
          aData[FILENAME,$1]=ARGV[1]==FILENAME?$0:$2"\t"$3;
          }
          END{
          for(k in aData)
          {
              split(k,idx,SUBSEP);
              if(idx[1]==ARGV[1] && (ARGV[2],idx[2]) in aData)
              {
                  print aData[ARGV[1],idx[2]],aData[ARGV[2],idx[2]] | "sort -n -k1";
              }
          }
          }' a.txt b.txt
           
          100     wang    man 90  80
          200 wangsan woman 80    70
          300 wangming man 60     50
          400 wangzheng man 70    20

          代码?#24471;鰨?

          这里用到2维数组,aData[文件名,关联列对应值] ,这种方法可以将多个文件内容。放入一个统一二维数组。然后循环数组,通过if((i,j} in array) 查找对应列值,在其它文件中是否存在。

          温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

          已有 0/1064 人参与

          发表评论:

          欢迎订阅运维教程网|运维教程|运维管理|运维技术文章

          欢迎使用手机扫描访问本站,还可以关注微?#25490;秪

          浙江11选5网上购买

          <meter id="k3l7y"><menuitem id="k3l7y"></menuitem></meter>
            <td id="k3l7y"><menuitem id="k3l7y"></menuitem></td>
                  <td id="k3l7y"></td>

                  <meter id="k3l7y"><menuitem id="k3l7y"></menuitem></meter>
                    <td id="k3l7y"><menuitem id="k3l7y"></menuitem></td>
                          <td id="k3l7y"></td>