Merge 将两个文件合并为第三个文件,使用列作为索引并合并行
我一直在学习awk,我遇到了一个无法解决的问题,如果可以,请帮助我 我有两个使用awk、sort和uniq-c生成的文件 文件1的格式为: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 含义:文件
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和日期之间。。不管怎样,这真是太神奇了。。删除无用的文件会很容易。。再次感谢!谢谢你的回答,但我选择了马克的,因为它更容易理解。无论如何谢谢你!当然没问题。只是想提供一个替代方案。:)