zoukankan      html  css  js  c++  java
  • awk 多文件操作2种实现方法

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

    实例文本:

    [chengmo@centos5 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进行合并操作。

    首先:

    [chengmo@centos5 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)

    继续:

    [chengmo@centos5 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传入参数总数,ARGV是数组,各个参数值。

    看下这些实例:

    [chengmo@centos5 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

    程序代码:

    [chengmo@centos5 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

    代码说明:

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

    以上是2种实现方法,其中第一种思路较为简单,很容易理解。第二种处理起来较为复杂。有更好方法大家给我分享。

  • 相关阅读:
    171. Excel Sheet Column Number (Easy)
    349. Intersection of Two Arrays (Easy)
    453. Minimum Moves to Equal Array Elements (Easy)
    657. Judge Route Circle (Easy)
    CSS笔记
    保存页面状态
    UI开发总结
    ubuntu 下配置munin
    反向代理配置
    JavaScript 高级程序设计第二版
  • 原文地址:https://www.cnblogs.com/chengmo/p/1851983.html
Copyright © 2011-2022 走看看