Merge 将两个文件合并为第三个文件,使用列作为索引并合并行

Merge 将两个文件合并为第三个文件,使用列作为索引并合并行,merge,awk,uniq,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 4 ddd.c 2 ccc.c 3 xxx.c 含义:文件

我一直在学习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
4 ddd.c

2 ccc.c

3 xxx.c
含义:文件名日期的数量(因此,同一日期有3个文件ccc.c,另一日期有1个文件ccc.c)

文件2的格式为:

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
4 ddd.c

2 ccc.c

3 xxx.c
意思是:不同日期名称的编号(因此,发现ccc.c有两个不同的日期)->使用反向grep删除编号为1的文件,因此不会有任何

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

不同日期名称日期1日期2日期3日期4(…)

比如:

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

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

提前谢谢

您应该能够仅使用第一个文件作为输入来获得该结果。下面使用两个关联数组。第一个收集文件的查看次数,第二个收集日期。
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]);
   }
}

你可以试试这样的-

#!/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 ""
          }
测试:
哦,文件是按名字排序的!我把这个例子放错顺序了,对不起,太棒了,谢谢你的快速回复!它没有显示不同日期的数量,但这并不重要。我只是把它加在这里了。再次感谢@乔纳斯塔德:啊!你是对的;在示例中,我没有注意到这一点。我更新了printf来添加它。是的,我也这么做了,只是我把计数放在f和日期之间。。不管怎样,这真是太神奇了。。删除无用的文件会很容易。。再次感谢!谢谢你的回答,但我选择了马克的,因为它更容易理解。无论如何谢谢你!当然没问题。只是想提供一个替代方案。:)