2

我一直在学习 awk,但遇到了一个我无法解决的问题,如果可以,请提供帮助。

我有 2 个使用 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 个不同的日期)-> 我使用反向 grep 删除了 number=1 的文件,因此不会有任何

我想做的是生成格式的第三个文件

number_of_different_dates 名称 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

提前致谢!

4

2 回答 2

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]);
   }
}
于 2012-01-19T14:01:47.643 回答
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 
于 2012-01-19T14:55:47.830 回答