将2个文件合并为第3个文件,使用列作为索引和合并行

时间:2012-01-19 13:17:54

标签: merge awk uniq

我一直在学习awk而且我遇到了一个我无法解决的问题,请尽可能帮忙。

我有两个使用awk,sort和uniq -c生成的文件。

文件1 的格式为:

1 aaa.c 10/10/2010

1 bbb.h 1/1/2011

3 ccc.c 2/2/2012

1 ccc.c 20/6/2011

1 ddd.c 1/1/2010

1 ddd.c 2/4/1999

1 ddd.c 7/1/2012

1 ddd.c 10/1/1977

含义: number_of_equal_files名称日期(因此,来自同一日期的3个文件ccc.c和来自另一个的1个文件ccc.c)

文件2 的格式为:

4 ddd.c

2 ccc.c

3 xxx.c

含义: number_of_different_dates名称(因此,已发现ccc.c有2个不同的日期) - >数字= 1的文件我删除了一个反向grep,所以不会有任何

我想做的是以

格式生成第三个文件

number_of_different_dates name date1 date2 date 3 date4(...)

类似的东西:

2 ccc.c 2/2/2012 20/6/2011 

4 ddd.c 1/1/2010 2/4/1999 7/1/2012 10/1/1977

提前致谢!

2 个答案:

答案 0 :(得分:2)

您应该只使用第一个文件作为输入来获得该结果。以下使用两个关联数组。第一个收集文件的次数,第二个收集日期。 END块只打印出现多次的条目。

{
   counts[$2] += 1;
   dates[$2] = sprintf( "%s %s", dates[$2], $3 );
}

END {
   for ( f in dates ) {
      if ( counts[f] > 1 )
     printf( "%d %s %s\n", counts[f], f, dates[f]);
   }
}

答案 1 :(得分:1)

你可以尝试这样的事情 -

#!/usr/bin/awk -f

NR==FNR{
            a[$3]=$2; b[$2]++;next
       } 

($2 in b){
            printf ("%s %s ", $1,$2);
            for (i in a) 
                if (a[i]==$2) 
                    printf i" "; print ""
          }

测试:

[jaypal:~/Temp] cat file1
1 aaa.c 10/10/2010

1 bbb.h 1/1/2011

3 ccc.c 2/2/2012

1 ccc.c 20/6/2011

1 ddd.c 1/1/2010

1 ddd.c 2/4/1999

1 ddd.c 7/1/2012

1 ddd.c 10/1/1977

[jaypal:~/Temp] cat file2
4 ddd.c

2 ccc.c

3 xxx.c

[jaypal:~/Temp] ./s.awk ff1 ff2
4 ddd.c 10/1/1977 1/1/2010 2/4/1999 7/1/2012 

2 ccc.c 20/6/2011 2/2/2012